Full Code of talkgo/night for AI

master c4900119ba35 cached
323 files
1.0 MB
410.4k tokens
193 symbols
1 requests
Download .txt
Showing preview only (1,131K chars total). Download the full file or copy to clipboard to get everything.
Repository: talkgo/night
Branch: master
Commit: c4900119ba35
Files: 323
Total size: 1.0 MB

Directory structure:
gitextract_sif4occr/

├── .all-contributorsrc
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── share_request.md
│   │   └── share_template.md
│   ├── dependabot.yml
│   ├── weekly-digest.yml
│   └── workflows/
│       ├── links.yml
│       └── monthly.yml
├── .gitignore
├── .markdownlint.json
├── .netlify/
│   └── state.json
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── HISTORY.md
├── JOINUS.md
├── LICENSE
├── Makefile
├── README.md
├── SHARE_REQUEST_PROPOSAL.md
├── actions/
│   ├── go.mod
│   ├── issuesinfo.json
│   └── monthly.go
├── archetypes/
│   └── default.md
├── config.toml
├── content/
│   ├── _index.md
│   ├── algorithms/
│   │   ├── 2020-12-27.md
│   │   ├── 2020-12-28.md
│   │   ├── 2020-12-29.md
│   │   ├── 2020-12-30.md
│   │   ├── 2021-01-01.md
│   │   ├── 2021-01-03.md
│   │   ├── 2021-01-06.md
│   │   ├── 2021-01-08.md
│   │   ├── 2021-01-09.md
│   │   ├── 2021-01-11.md
│   │   └── 2021-01-12.md
│   ├── articles/
│   │   ├── 2018-05-31-batch-del-redis-key.md
│   │   ├── 2018-11-11-golang-file-lock.md
│   │   ├── 2019-11-07-Raft--易于理解的一致性算法.md
│   │   ├── 2020-02-08-source_go_flag.md
│   │   ├── _index.md
│   │   ├── goroutine_and_channel/
│   │   │   └── README.md
│   │   ├── how_to_profile/
│   │   │   └── how_to_profile.md
│   │   ├── how_to_test/
│   │   │   └── README.md
│   │   ├── sonarqube-for-golang/
│   │   │   ├── 2018-07-22-sonarqube-for-golang.md
│   │   │   ├── Dockerfile
│   │   │   ├── index.md
│   │   │   └── run.sh
│   │   ├── sony-gobreaker/
│   │   │   └── README.md
│   │   └── sync/
│   │       ├── README.md
│   │       ├── sync_Map_source_code_analysis.md
│   │       ├── sync_cond_source_code_analysis.md
│   │       ├── sync_mutex_source_code_analysis.md
│   │       ├── sync_once_source_code_analysis.md
│   │       ├── sync_rwmutex_source_code_analysis.md
│   │       └── sync_waitgroup_source_code_analysis.md
│   ├── discuss/
│   │   ├── 2018-05-08-anlayze-underscore-in-go.md
│   │   ├── 2018-05-09-wechat-discuss.md
│   │   ├── 2018-05-10-which-vendor-tool.md
│   │   ├── 2018-05-13-declaring-variables-on-if-else.md
│   │   ├── 2018-05-16-the-way-to-go.md
│   │   ├── 2018-05-18-bitset-and-import-cycle-not-allowed.md
│   │   ├── 2018-05-21-using-goroutines-on-loop-iterator-variables.md
│   │   ├── 2018-05-22-go-string-to-byte-slice.md
│   │   ├── 2018-05-23-wechat-discuss.md
│   │   ├── 2018-05-28-pprof-in-go.md
│   │   ├── 2018-06-07-dial-timeout-in-go.md
│   │   ├── 2018-07-02-c1000k-on-linux.md
│   │   ├── 2018-07-04-package-names.md
│   │   ├── 2018-07-09-make-new-in-go.md
│   │   ├── 2018-07-11-using_64bit_atomic_in_32bit_system.md
│   │   ├── 2018-07-14-version-gopath-go-command.md
│   │   ├── 2018-07-31-println-Println-and_context.md
│   │   ├── 2018-08-02-apns-push-notification.md
│   │   ├── 2018-08-02-go-shell.md
│   │   ├── 2018-08-09-log-color-in-go.md
│   │   ├── 2018-08-14-wechat-discuss.md
│   │   ├── 2018-08-15-wechat-discuss.md
│   │   ├── 2018-08-23-wechat-discuss.md
│   │   ├── 2018-08-24-wechat-discuss.md
│   │   ├── 2018-08-30-understanding-go-interfaces.md
│   │   ├── 2018-09-04-wechat-discuss.md
│   │   ├── 2018-09-05-git-system.md
│   │   ├── 2018-09-14-tips-in-vscode.md
│   │   ├── 2018-09-18-benchmark-tools.md
│   │   ├── 2018-09-19-wechat-discuss.md
│   │   ├── 2018-09-28-return-value-in-waitgroup.md
│   │   ├── 2018-10-18-encOp.md
│   │   ├── 2018-11-08-address_operators.md
│   │   ├── 2018-11-08-aws-ec2-ssh-login-problem.md
│   │   ├── 2018-11-09-force-to-use-keyed-struct-literals.md
│   │   ├── 2018-11-29-config-in-go.md
│   │   ├── 2018-12-04-change-to-go.md
│   │   ├── 2018-12-04-wechat-discuss.md
│   │   ├── 2018-12-07-wechat-discuss.md
│   │   ├── 2018-12-11-wechat-discuss.md
│   │   ├── 2018-12-25-macOS-time-synchronization.md
│   │   ├── 2019-01-10-anlayze-range.md
│   │   ├── 2019-02-20-bigdecimal-show-string.md
│   │   ├── 2019-03-07-wechat-discuss.md
│   │   ├── 2019-03-08-wechat-discuss.md
│   │   ├── 2019-03-26-gopsutil.md
│   │   ├── 2019-04-10-remove-local-branch-in-merged-master.md
│   │   ├── 2019-05-15-jaeger.md
│   │   ├── 2019-05-21-chromedp.md
│   │   ├── 2019-06-19-gorm-mysql-timestamp.md
│   │   ├── 2019-07-16-assign-and-range.md
│   │   ├── 2019-07-17-global-variable-init.md
│   │   ├── 2019-10-13-go-module-looping-package.md
│   │   ├── _index.md
│   │   └── log_color_test.go
│   ├── harvest/
│   │   ├── _index.md
│   │   └── harvest.md
│   ├── home.md
│   ├── interview/
│   │   ├── _index.md
│   │   ├── articles/
│   │   │   ├── interview_analysis_1.md
│   │   │   ├── interview_analysis_2.md
│   │   │   ├── interview_analysis_3.md
│   │   │   └── interview_analysis_4.md
│   │   ├── interview-algorithm.md
│   │   ├── interview-architecture.md
│   │   ├── interview-data-structure.md
│   │   ├── interview-database.md
│   │   ├── interview-design.md
│   │   ├── interview-golang-language.md
│   │   ├── interview-network.md
│   │   ├── interview-os.md
│   │   └── interview-pen.md
│   ├── night/
│   │   ├── 1-2018-03-21-goutil.md
│   │   ├── 1-2019-03-14-daily-reading.md
│   │   ├── 10-2018-06-28-net-http-part4.md
│   │   ├── 104-2020-09-13-hashicorp-raft.md
│   │   ├── 105-2020-10-03-go-zero-discuss.md
│   │   ├── 11-2018-07-26-golang-jenkins-sonarqube.md
│   │   ├── 12-2018-08-02-goroutine-GPM.md
│   │   ├── 13-2018-08-09-kubernetes-guide.md
│   │   ├── 14-2018-08-17-sync-pool-reading.md
│   │   ├── 15-2018-08-23-pool-workshop-in-go.md
│   │   ├── 16-2018-09-06-gateway-reading.md
│   │   ├── 17-2018-09-20-grpcp.md
│   │   ├── 18-2018-09-27-CovenantSQL-DH-RPC.md
│   │   ├── 19-2018-11-08-http-router-in-go.md
│   │   ├── 2-2018-04-11-teleport.md
│   │   ├── 20-2018-11-15-go-test.md
│   │   ├── 21-2018-11-28-errors-in-go.md
│   │   ├── 22-2018-12-06-go-ide-discuss.md
│   │   ├── 23-2018-12-13-drone-guide.md
│   │   ├── 24-2018-12-23-go-mod-part-1.md
│   │   ├── 25-2018-12-27-tsdb.md
│   │   ├── 26-2019-01-03-blog-with-github-netlify.md
│   │   ├── 27-2019-01-10-go-mod-part-2.md
│   │   ├── 28-2019-01-17-go-mod-part-3.md
│   │   ├── 29-2019-01-23-opentracing-jaeger-in-go.md
│   │   ├── 3-2018-04-18-strings-part1.md
│   │   ├── 30-2019-02-16-go-mod-part-4.md
│   │   ├── 31-2019-02-23-flag.md
│   │   ├── 32-2019-03-02-etcd-raft.md
│   │   ├── 33-2019-03-07-defer-in-go.md
│   │   ├── 34-2019-03-16-plan9-guide.md
│   │   ├── 35-2019-03-21-reading-context.md
│   │   ├── 36-2019-03-28-reading-k8s-context.md
│   │   ├── 37-2019-04-01-talk-from-serverless-in-apache-pulsar.md
│   │   ├── 38-2019-04-13-k8s-scheduler-reading.md
│   │   ├── 39-2019-04-18-init-function-in-go.md
│   │   ├── 4-2018-04-25-strings-part2.md
│   │   ├── 40-2019-04-27-atomic-value-in-go.md
│   │   ├── 41-2019-05-12-golint-golangci-lint.md
│   │   ├── 42-2019-05-16-go-failpoint-design.md
│   │   ├── 43-2019-05-23-gomonkey-framework-design-and-practives.md
│   │   ├── 44-2019-05-29-go-map-reading.md
│   │   ├── 45-2019-05-30-goim-reading.md
│   │   ├── 46-2019-06-05-tidb-overview-reading.md
│   │   ├── 47-2019-06-12-tidb-exector-reading.md
│   │   ├── 48-2019-06-19-tidb-compiler-reading.md
│   │   ├── 49-2019-06-26-tidb-transaction-reading.md
│   │   ├── 5-2018-05-10-strings-part3.md
│   │   ├── 50-2019-06-27-goland-practice.md
│   │   ├── 51-2019-07-18-sync-errgroup.md
│   │   ├── 52-2019-07-25-httprouter-guide.md
│   │   ├── 53-2019-08-01-build-in-delete-from-map-in-go.md
│   │   ├── 54-2019-08-14-tidb-sql-tools.md
│   │   ├── 55-2019-08-15-go-webassembly-guide.md
│   │   ├── 56-2019-08-22-channel-select-in-go.md
│   │   ├── 57-2019-08-29-sync-semaphore.md
│   │   ├── 58-2019-09-05-whats-new-in-go1.13.md
│   │   ├── 59-2019-09-12-real-world-go-concurrency-bugs-in-paper-reading.md
│   │   ├── 6-2018-05-17-strings-part4.md
│   │   ├── 60-2019-09-19-ipfs-guide.md
│   │   ├── 61-2019-09-26-go-module-goproxy-cn.md
│   │   ├── 62-2019-10-10-go-micro-part1.md
│   │   ├── 63-2019-10-17-go-style-and-go-advices.md
│   │   ├── 64-2019-10-24-go-runtime.md
│   │   ├── 65-2019-10-31-go-net.md
│   │   ├── 66-2019-11-07-paper-reading-csp.md
│   │   ├── 67-2019-11-14-sql-pool-reading.md
│   │   ├── 68-2019-11-21-dive-into-network.md
│   │   ├── 69-2019-11-28-devops.md
│   │   ├── 7-2018-05-24-net-http-part1.md
│   │   ├── 70-2019-12-05-go-details.md
│   │   ├── 71-2019-12-12-go-ini.md
│   │   ├── 72-2019-12-19-go-micro-2.md
│   │   ├── 73-2019-12-28-qrpc.md
│   │   ├── 74-2020-01-02-time-in-go-1-14.md
│   │   ├── 75-2020-02-06-the-state-of-go-in-2020.md
│   │   ├── 76-2020-02-20-kubernetes-scheduler-design.md
│   │   ├── 77-2020-03-05-reading-go-earnings.md
│   │   ├── 78-2020-03-11-go-scheduler-reading.md
│   │   ├── 79-2020-03-12-go-micro-tools.md
│   │   ├── 8-2018-05-31-net-http-part2.md
│   │   ├── 80-2020-03-18-go2-generics.md
│   │   ├── 81-2020-03-19-gorm-guide.md
│   │   ├── 82-2020-03-21-talkgo-night-story.md
│   │   ├── 83-2020-03-26-gobench.md
│   │   ├── 84-2020-04-02-go-aligned.md
│   │   ├── 85-2020-04-16-douyu-confgo.md
│   │   ├── 86-2020-04-23-go-unsafe-pointer.md
│   │   ├── 87-2020-04-29-goland-tips.md
│   │   ├── 9-2018-06-14-net-http-part3.md
│   │   ├── _index.md
│   │   └── other/
│   │       ├── 16-2018-09-06-faas-provider.md
│   │       ├── 16-2018-09-06-openfaas-guide.md
│   │       ├── 16-2018-09-06-queue-worker.md
│   │       ├── 16-2018-09-06-quick-start.md
│   │       ├── 16-2018-09-06-watchdog.md
│   │       ├── 2-2018-04-11_voice.md
│   │       ├── sync-pool-demo/
│   │       │   ├── cmd/
│   │       │   │   └── makeslice.go
│   │       │   ├── demo/
│   │       │   │   └── main.go
│   │       │   ├── demo2/
│   │       │   │   └── main.go
│   │       │   └── main.go
│   │       └── zap-learn/
│   │           ├── go.mod
│   │           ├── go.sum
│   │           ├── logger/
│   │           │   ├── logger.go
│   │           │   ├── logger_test.go
│   │           │   └── zap/
│   │           │       └── zap.go
│   │           └── main.go
│   ├── other/
│   │   ├── _index.md
│   │   ├── awesome-tools-mac.md
│   │   ├── dev-tools-vimrc.md
│   │   └── goland-help.md
│   └── proposal/
│       ├── _index.md
│       └── changes-to-go.md
├── examples/
│   ├── README.md
│   └── gin_examples/
│       ├── .gitignore
│       ├── .gitkeep
│       ├── ENDPOINTS.md
│       ├── Makefile
│       ├── README.md
│       ├── cmd/
│       │   └── server/
│       │       └── main.go
│       ├── docker-compose-dev.yml
│       ├── go.mod
│       ├── go.sum
│       ├── pkg/
│       │   ├── auth/
│       │   │   ├── auth.go
│       │   │   ├── auth_test.go
│       │   │   ├── sessionId.go
│       │   │   └── sessionId_test.go
│       │   ├── config/
│       │   │   ├── config.go
│       │   │   └── config_test.go
│       │   ├── http/
│       │   │   ├── middleware.go
│       │   │   ├── middleware_test.go
│       │   │   ├── routes.go
│       │   │   ├── server.go
│       │   │   ├── userHandler.go
│       │   │   └── userHandler_test.go
│       │   ├── mock/
│       │   │   ├── repository.go
│       │   │   └── service.go
│       │   ├── postgres/
│       │   │   ├── postgres.go
│       │   │   └── userrepository.go
│       │   └── service/
│       │       └── userservice/
│       │           ├── userservice.go
│       │           └── userservice_test.go
│       └── user.go
├── gen_contributors.sh
├── go.mod
├── go.sum
├── layouts/
│   ├── _default/
│   │   ├── index.json
│   │   └── list.html
│   └── shortcodes/
│       └── badges.html
├── macos-terminal-proxy-set.md
├── package.json
├── practice/
│   └── reading-go-43/
│       ├── README.md
│       └── main.go
├── static/
│   ├── icons/
│   │   ├── Read Me.txt
│   │   ├── demo-files/
│   │   │   ├── demo.css
│   │   │   └── demo.js
│   │   ├── demo.html
│   │   ├── selection.json
│   │   └── style.css
│   └── javascripts/
│       └── application.js
├── talkgo.go
├── talkgo_test.go
└── themes/
    └── hugo-material-docs/
        ├── CHANGELOG.md
        ├── LICENSE.md
        ├── README.md
        ├── archetypes/
        │   └── default.md
        ├── exampleSite/
        │   ├── config.toml
        │   ├── content/
        │   │   ├── adding-content/
        │   │   │   └── index.md
        │   │   ├── getting-started/
        │   │   │   └── index.md
        │   │   ├── index.md
        │   │   ├── license/
        │   │   │   └── index.md
        │   │   └── roadmap/
        │   │       └── index.md
        │   └── static/
        │       └── .gitkeep
        ├── layouts/
        │   ├── 404.html
        │   ├── _default/
        │   │   ├── __list.html
        │   │   └── single.html
        │   ├── index.html
        │   ├── partials/
        │   │   ├── comment.html
        │   │   ├── drawer.html
        │   │   ├── drawer_list.html
        │   │   ├── footer.html
        │   │   ├── footer_js.html
        │   │   ├── head.html
        │   │   ├── header.html
        │   │   ├── nav.html
        │   │   └── nav_link.html
        │   └── shortcodes/
        │       ├── note.html
        │       └── warning.html
        ├── static/
        │   ├── javascripts/
        │   │   ├── application.js
        │   │   ├── growingio.js
        │   │   └── modernizr.js
        │   └── stylesheets/
        │       ├── application.css
        │       ├── palettes.css
        │       └── temporary.css
        └── theme.toml

================================================
FILE CONTENTS
================================================

================================================
FILE: .all-contributorsrc
================================================
{
  "projectName": "night",
  "projectOwner": "talkgo",
  "repoType": "github",
  "repoHost": "https://github.com",
  "files": [
    "README.md"
  ],
  "imageSize": 100,
  "commit": true,
  "contributors": [
    {
      "login": "yangwenmai",
      "name": "maiyang",
      "avatar_url": "https://avatars3.githubusercontent.com/u/1710912?v=4",
      "profile": "https://github.com/yangwenmai",
      "contributions": [
        "code",
        "ideas",
        "review",
        "talk",
        "tutorial"
      ]
    },
    {
      "login": "mougeCM",
      "name": "Simple Min",
      "avatar_url": "https://avatars1.githubusercontent.com/u/16773339?v=4",
      "profile": "https://github.com/mougeCM",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "yuhao5",
      "name": "kenny",
      "avatar_url": "https://avatars3.githubusercontent.com/u/35653599?v=4",
      "profile": "https://github.com/yuhao5",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "charnlsxy",
      "name": "charnlsxy",
      "avatar_url": "https://avatars2.githubusercontent.com/u/13843868?v=4",
      "profile": "https://github.com/charnlsxy",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "AceDarkknight",
      "name": "AceDarkknight",
      "avatar_url": "https://avatars3.githubusercontent.com/u/11901298?v=4",
      "profile": "https://github.com/AceDarkknight",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "gnuos",
      "name": "Data",
      "avatar_url": "https://avatars2.githubusercontent.com/u/3014297?v=4",
      "profile": "https://github.com/gnuos",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "KISSMonX",
      "name": "侯名",
      "avatar_url": "https://avatars0.githubusercontent.com/u/2876745?v=4",
      "profile": "https://github.com/KISSMonX",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "dumliu01",
      "name": "dumliu01",
      "avatar_url": "https://avatars0.githubusercontent.com/u/12060175?v=4",
      "profile": "https://github.com/dumliu01",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "hlily2005",
      "name": "hlily2005",
      "avatar_url": "https://avatars0.githubusercontent.com/u/1411282?v=4",
      "profile": "https://github.com/hlily2005",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "henrylee2cn",
      "name": "henrylee2cn",
      "avatar_url": "https://avatars3.githubusercontent.com/u/10174178?v=4",
      "profile": "https://github.com/henrylee2cn",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "shaqsnake",
      "name": "shaqsnake",
      "avatar_url": "https://avatars0.githubusercontent.com/u/1336914?v=4",
      "profile": "https://github.com/shaqsnake",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "TBWISK",
      "name": "tbwisk",
      "avatar_url": "https://avatars0.githubusercontent.com/u/5728787?v=4",
      "profile": "https://github.com/TBWISK",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "toontong",
      "name": "Huang ChuanTong",
      "avatar_url": "https://avatars3.githubusercontent.com/u/416141?v=4",
      "profile": "https://github.com/toontong",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "zhongxuan123",
      "name": "The notes of SQL optimize ",
      "avatar_url": "https://avatars3.githubusercontent.com/u/10513552?v=4",
      "profile": "https://github.com/zhongxuan123",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "zhouxinxin19920802",
      "name": "zhouxinxin19920802",
      "avatar_url": "https://avatars2.githubusercontent.com/u/29008269?v=4",
      "profile": "https://github.com/zhouxinxin19920802",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "macaria",
      "name": "macaria",
      "avatar_url": "https://avatars2.githubusercontent.com/u/20811449?v=4",
      "profile": "https://github.com/macaria",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "DennisMao",
      "name": "Dennis",
      "avatar_url": "https://avatars3.githubusercontent.com/u/15226239?v=4",
      "profile": "http://github.com/DennisMao",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "orangle",
      "name": "orangleliu",
      "avatar_url": "https://avatars1.githubusercontent.com/u/2696746?v=4",
      "profile": "http://blog.csdn.net/orangleliu",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "HarbinZhang",
      "name": "HarbinZhang",
      "avatar_url": "https://avatars1.githubusercontent.com/u/21693162?v=4",
      "profile": "https://github.com/HarbinZhang",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "SwanSpouse",
      "name": "LiMingji",
      "avatar_url": "https://avatars1.githubusercontent.com/u/7344921?v=4",
      "profile": "https://github.com/SwanSpouse",
      "contributions": [
        "code",
        "doc"
      ]
    },
    {
      "login": "mickey0524",
      "name": "wintersnow",
      "avatar_url": "https://avatars0.githubusercontent.com/u/22164927?v=4",
      "profile": "https://mickey0524.github.io/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "zhuzhenfeng-finogeeks",
      "name": "zhuzhenfeng",
      "avatar_url": "https://avatars2.githubusercontent.com/u/44076738?v=4",
      "profile": "https://github.com/zhuzhenfeng-finogeeks",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "xujiajun",
      "name": "徐佳军",
      "avatar_url": "https://avatars2.githubusercontent.com/u/6065007?v=4",
      "profile": "https://xujiajun.cn",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "NichoZhang",
      "name": "nicho",
      "avatar_url": "https://avatars0.githubusercontent.com/u/6884499?v=4",
      "profile": "https://github.com/NichoZhang",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "qclaogui",
      "name": "Weifeng Wang",
      "avatar_url": "https://avatars1.githubusercontent.com/u/17244565?v=4",
      "profile": "https://www.btxiaowei.net",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "john-deng",
      "name": "John Deng",
      "avatar_url": "https://avatars3.githubusercontent.com/u/6748475?v=4",
      "profile": "https://hiboot.hidevops.io",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jeasonstudio",
      "name": "赵吉彤",
      "avatar_url": "https://avatars0.githubusercontent.com/u/17971291?v=4",
      "profile": "http://jeasonstudio.github.io",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "xpzouying",
      "name": "YING ZOU",
      "avatar_url": "https://avatars0.githubusercontent.com/u/3946563?v=4",
      "profile": "http://zouying.is",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "zsy619",
      "name": "zsy619",
      "avatar_url": "https://avatars3.githubusercontent.com/u/6278792?v=4",
      "profile": "https://github.com/zsy619",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "yangfan21",
      "name": "杨帆",
      "avatar_url": "https://avatars2.githubusercontent.com/u/11313960?v=4",
      "profile": "https://blog.yangfan21.cn/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "hundredlee",
      "name": "HundredLee",
      "avatar_url": "https://avatars3.githubusercontent.com/u/9268902?v=4",
      "profile": "https://blog.sodroid.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "mlboy",
      "name": "mlboy",
      "avatar_url": "https://avatars3.githubusercontent.com/u/1733903?v=4",
      "profile": "https://github.com/mlboy",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "liangyuanpeng",
      "name": "fish",
      "avatar_url": "https://avatars1.githubusercontent.com/u/28711504?v=4",
      "profile": "https://liangyuanpeng.netlify.com/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "abcdsxg",
      "name": "时小光",
      "avatar_url": "https://avatars2.githubusercontent.com/u/20315934?v=4",
      "profile": "https://laji.cx",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ziyi-yan",
      "name": "Ziyi Yan",
      "avatar_url": "https://avatars1.githubusercontent.com/u/44582639?v=4",
      "profile": "https://ziyi-yan.github.io",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "lpflpf",
      "name": "李朋飞",
      "avatar_url": "https://avatars2.githubusercontent.com/u/11867562?s=460&v=4",
      "profile": "https://github.com/lpflpf",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "EDDYCJY",
      "name": "煎鱼",
      "avatar_url": "https://avatars0.githubusercontent.com/u/13746731?v=4",
      "profile": "https://github.com/EDDYCJY",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "feirie",
      "name": "Wang Fei",
      "avatar_url": "https://avatars2.githubusercontent.com/u/3349949?v=4",
      "profile": "https://github.com/feirie",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jukylin",
      "name": "742161455",
      "avatar_url": "https://avatars0.githubusercontent.com/u/8568271?v=4",
      "profile": "https://github.com/jukylin",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "feifeiiiiiiiiiii",
      "name": "feifeiiiiiiiiiii",
      "avatar_url": "https://avatars1.githubusercontent.com/u/3310967?s=460&v=4",
      "profile": "https://github.com/feifeiiiiiiiiiii",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "cuishuang",
      "name": "崔爽",
      "avatar_url": "https://avatars0.githubusercontent.com/u/15921519?v=4",
      "profile": "https://github.com/cuishuang",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "JasonRD",
      "name": "jasonxie",
      "avatar_url": "https://avatars1.githubusercontent.com/u/16793420?v=4",
      "profile": "http://www.techclone.cn",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "itcuihao",
      "name": "haoc7",
      "avatar_url": "https://avatars0.githubusercontent.com/u/9942270?v=4",
      "profile": "http://cuihao.fun",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "wangriyu",
      "name": "鱼乐",
      "avatar_url": "https://avatars3.githubusercontent.com/u/24445731?s=400&v=4",
      "profile": "https://blog.wangriyu.wang/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Littlesqx",
      "name": "Littlesqx",
      "avatar_url": "https://avatars2.githubusercontent.com/u/16516151?s=400&v=4",
      "profile": "https://littlesqx.github.io/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "mchangxin",
      "name": "mchangxin",
      "avatar_url": "https://avatars1.githubusercontent.com/u/31753706?s=400&v=4",
      "profile": "https://github.com/mchangxin",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "Hokkaitao",
      "name": "Hokkaitao",
      "avatar_url": "https://avatars0.githubusercontent.com/u/32830059?s=400&v=4",
      "profile": "https://github.com/Hokkaitao",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "LIYINGZHEN",
      "name": "Max Li",
      "avatar_url": "https://avatars3.githubusercontent.com/u/11765228?v=4",
      "profile": "http://maxlivinci.com/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "wty4427300",
      "name": "GameOver ",
      "avatar_url": "https://avatars2.githubusercontent.com/u/41495709?s=460&v=4",
      "profile": "https://www.jianshu.com/u/5eea945d14f6",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "davygeek",
      "name": "davygeek",
      "avatar_url": "https://avatars2.githubusercontent.com/u/12783140?s=460&v=4",
      "profile": "http://davygeek.cnblogs.com/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "changkun",
      "name": "Ou Changkun",
      "avatar_url": "https://avatars0.githubusercontent.com/u/5498964?s=460&v=4",
      "profile": "https://changkun.de/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "LinkinStars",
      "name": "LinkinStar",
      "avatar_url": "https://avatars2.githubusercontent.com/u/19712692?s=460&v=4",
      "profile": "http://www.cnblogs.com/linkstar/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "azd1997",
      "name": "Eiger",
      "avatar_url": "https://avatars3.githubusercontent.com/u/33643657?s=460&v=4",
      "profile": "http://azd1997.github.io/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "dayuoba",
      "name": "dayu",
      "avatar_url": "https://avatars1.githubusercontent.com/u/9914235?s=460&v=4",
      "profile": "http://dayuoba.github.io/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "scylhy",
      "name": "scylhy",
      "avatar_url": "https://avatars1.githubusercontent.com/u/12492939?s=460&v=4",
      "profile": "https://blog.csdn.net/scylhy",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "sober-wang",
      "name": "尚墨",
      "avatar_url": "https://avatars0.githubusercontent.com/u/35804630?s=460&v=4",
      "profile": "https://github.com/sober-wang",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "xhochipe",
      "name": "xhochipe",
      "avatar_url": "https://avatars0.githubusercontent.com/u/9391575?s=460&v=4",
      "profile": "https://github.com/xhochipe",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "panjf2000",
      "name": "Andy Pan",
      "avatar_url": "https://avatars2.githubusercontent.com/u/7496278?v=4",
      "profile": "http://taohuawu.club",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "jinzhu",
      "name": "Jinzhu",
      "avatar_url": "https://avatars3.githubusercontent.com/u/6843?v=4",
      "profile": "http://patreon.com/jinzhu",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "unknwon",
      "name": "Unknwon",
      "avatar_url": "https://avatars3.githubusercontent.com/u/2946214?v=4",
      "profile": "https://unknwon.io",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "printfcoder",
      "name": "Shu xian",
      "avatar_url": "https://avatars3.githubusercontent.com/u/20906540?v=4",
      "profile": "https://github.com/printfcoder",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "nandyliu",
      "name": "nandyliu",
      "avatar_url": "https://avatars3.githubusercontent.com/u/16110707?v=4",
      "profile": "https://github.com/nandyliu",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "shanksyang",
      "name": "shanks",
      "avatar_url": "https://avatars0.githubusercontent.com/u/5027885?v=4",
      "profile": "http://redhair.cn",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "yaxinlx",
      "name": "yaxinlx",
      "avatar_url": "https://avatars1.githubusercontent.com/u/15266642?v=4",
      "profile": "https://github.com/yaxinlx",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "appleboy",
      "name": "Bo-Yi Wu",
      "avatar_url": "https://avatars0.githubusercontent.com/u/21979?v=4",
      "profile": "http://about.me/appleboy",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "KippaZou",
      "name": "Kippa",
      "avatar_url": "https://avatars2.githubusercontent.com/u/31032511?v=4",
      "profile": "https://github.com/KippaZou",
      "contributions": [
        "code",
        "talk"
      ]
    },
    {
      "login": "15ho",
      "name": "15ho",
      "avatar_url": "https://avatars2.githubusercontent.com/u/20267050?v=4",
      "profile": "https://github.com/15ho",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "draveness",
      "name": "Draven",
      "avatar_url": "https://avatars0.githubusercontent.com/u/6493255?v=4",
      "profile": "https://draveness.me/",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "h3l",
      "name": "h3l",
      "avatar_url": "https://avatars0.githubusercontent.com/u/1664952?v=4",
      "profile": "https://github.com/h3l",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "seladb",
      "name": "seladb",
      "avatar_url": "https://avatars3.githubusercontent.com/u/9059541?v=4",
      "profile": "https://twitter.com/seladb",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "haojunyu",
      "name": "郝俊禹",
      "avatar_url": "https://avatars1.githubusercontent.com/u/5105483?v=4",
      "profile": "https://github.com/haojunyu",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "luojiego",
      "name": "Roger",
      "avatar_url": "https://avatars2.githubusercontent.com/u/3175699?v=4",
      "profile": "https://github.com/luojiego",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "binderclip",
      "name": "clip",
      "avatar_url": "https://avatars3.githubusercontent.com/u/8187479?v=4",
      "profile": "https://yuque.com/clip",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "shengyou",
      "name": "Shengyou Fan",
      "avatar_url": "https://avatars2.githubusercontent.com/u/1264736?v=4",
      "profile": "https://github.com/shengyou",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "dlsniper",
      "name": "Florin Pățan",
      "avatar_url": "https://avatars2.githubusercontent.com/u/607868?v=4",
      "profile": "http://florinpatan.ro",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "kevwan",
      "name": "Kevin Wan",
      "avatar_url": "https://avatars1.githubusercontent.com/u/1918356?v=4",
      "profile": "http://www.xiaoheiban.cn",
      "contributions": [
        "talk",
        "doc"
      ]
    },
    {
      "login": "Kydaa",
      "name": "小佳",
      "avatar_url": "https://avatars1.githubusercontent.com/u/23324176?v=4",
      "profile": "https://github.com/Kydaa",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "shima-park",
      "name": "Xingwang Liu",
      "avatar_url": "https://avatars.githubusercontent.com/u/4186507?v=4",
      "profile": "https://github.com/shima-park",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "ionling",
      "name": "零件",
      "avatar_url": "https://avatars.githubusercontent.com/u/20399569?v=4",
      "profile": "https://flow.visionhope.cn",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "jaydenwen123",
      "name": "jaydenwen123",
      "avatar_url": "https://avatars.githubusercontent.com/u/38454179?v=4",
      "profile": "https://github.com/jaydenwen123",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "roseduan",
      "name": "roseduan",
      "avatar_url": "https://avatars.githubusercontent.com/u/22375523?v=4",
      "profile": "https://space.bilibili.com/26194591",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "yedf",
      "name": "yedf",
      "avatar_url": "https://avatars.githubusercontent.com/u/6055142?v=4",
      "profile": "https://github.com/yedf",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "dreamerjackson",
      "name": "jonson",
      "avatar_url": "https://avatars.githubusercontent.com/u/42735226?v=4",
      "profile": "https://dreamerjonson.com/",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "epii1",
      "name": "epii1",
      "avatar_url": "https://avatars.githubusercontent.com/u/2030591?v=4",
      "profile": "https://taoshu.in",
      "contributions": [
        "talk"
      ]
    },
    {
      "login": "eltociear",
      "name": "Ikko Ashimine",
      "avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4",
      "profile": "https://bandism.net/",
      "contributions": [
        "doc"
      ]
    }
  ],
  "contributorsPerLine": 7,
  "skipCi": true,
  "commitConvention": "angular"
}


================================================
FILE: .gitattributes
================================================
*.* linguist-language=go

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

patreon: maiyang


================================================
FILE: .github/ISSUE_TEMPLATE/share_request.md
================================================
---
name: '提案:如何发起一次分享请求?'
title: '【发起分享提案】'
labels: 分享话题, Go 夜读
assignees: yangwenmai, changkun
about: 此模板主要用于如何发起分享提案的小伙伴。
---

## <话题名称>

(此话题的简短描述。)

## 诉求

(分享讲师,分享核心点等。)

<!--
## 提案接受规则

1 个月内接受到 80 个 👍。
-->

## 参考资料

(你可以罗列出你对此话题的一些研究,以及你所掌握的一些参考资料,以便大家更好的了解这个分享提案。)

----

## 备注

任何你想要表达的话语。


================================================
FILE: .github/ISSUE_TEMPLATE/share_template.md
================================================
---
name: '第 100 期<你的话题名称>'
title: '【分享计划】'
labels: 分享话题, Go 夜读, 预习资料
assignees: yangwenmai, changkun
about: 此模板主要是针对提交分享计划的小伙伴,否则请忽略。
---

## 【Go 夜读】 <话题名称>

(对本期分享话题做一个简短说明。)

## 大纲

## 分享者自我介绍

你的名字,来自哪家公司,担任什么职务,Go 所承载的数据量等各方面。

## 分享时间

20XX-YY-ZZ 21:00 UTC+8

## 分享地址

https://zoom.us/j/6923842137

## Slides

(尽量使用可在线预览的幻灯片)

推荐使用以下 2 个 Slides 的某一个作为模板:

- https://docs.google.com/presentation/d/1yZO6a9MKABDPZmmP0zlgQ-jf7ctTzT4WZwMn_NGUO98/edit?usp=sharing
- https://docs.google.com/presentation/d/1clppbBqjxzPrj-26d_zVeJK2fFiXCsNVXYhKPjEZ4Tc/edit?usp=sharing

## 参考资料

(你可以列出本次分享所涉及的参考资料,以便大家更好的预习。)

----

## 备注

针对此次分享的 QA 请分享者在分享之后,整理同步到此 issues 后面。


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "github-actions" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "daily"


================================================
FILE: .github/weekly-digest.yml
================================================
# Configuration for weekly-digest - https://github.com/apps/weekly-digest
publishDay: "thursday"
canPublishIssues: true
canPublishPullRequests: true
canPublishContributors: true
canPublishStargazers: true
canPublishCommits: true

================================================
FILE: .github/workflows/links.yml
================================================
name: Links

on:
  repository_dispatch:
  workflow_dispatch:
  schedule:
    - cron: "0 0 1 * *"

jobs:
  linkChecker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6.0.2

      - name: Link Checker
        uses: lycheeverse/lychee-action@v2.8.0
        with:
          args: --verbose --no-progress **/*.md **/*.html
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

      - name: Create Issue From File
        uses: peter-evans/create-issue-from-file@v6
        with:
          title: Link Checker Report
          content-filepath: ./lychee/out.md
          labels: report, automated issue

================================================
FILE: .github/workflows/monthly.yml
================================================
name: auto_monthly_recommend

on:
  schedule:
  - cron: "0 12 1 * *"

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6.0.2
      - name: build-go
        run: |
          go env -w GO111MODULE=on
          cd actions && go build -o monthly monthly.go
      - name: create-issue
        env:
          GITHUB_TOKEN: ${{ secrets.TOKEN }}
        run: cd actions &&./monthly -c ./issuesinfo.json


================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.dll
*.so
*.dylib

# Test binary, build with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
.glide/
.DS_Store

.idea

talkgo
night-reading-go

# Ignore hugo generated files
public/
resources/
.vscode


================================================
FILE: .markdownlint.json
================================================
{
    "default": true,
    "MD007": false,
    "no-hard-tabs": false,
    "line-length": false,
    "no-inline-html": {
        "allowed_elements": ["img", "br", "sub", "b"]
    }
}

================================================
FILE: .netlify/state.json
================================================
{
	"siteId": "6ec64a83-fe6a-4891-8090-d75129fa87be"
}

================================================
FILE: CONTRIBUTING.md
================================================
---
title: 如何参与贡献?
---

欢迎大家参与讨论,更欢迎大家多多的回馈社区,来开始共享吧!

## 贡献流程

### 第一步:Fork [https://github.com/talkgo/night](https://github.com/talkgo/night) 项目

1. 访问 [https://github.com/talkgo/night](https://github.com/talkgo/night);
2. 点击 Fork 按钮(顶部右侧),建立基于此的分支;

### 第二步:克隆分支到你本地

```sh
# Define a local working directory:
$ working_dir=/.../src/github.com/talkgo
$ user={your github profile name}
$ mkdir -p $working_dir
$ cd $working_dir
$ git clone https://github.com/$user/night-reading-go.git
$ cd $working_dir/night-reading-go
$ git remote -v
origin	https://github.com/$user/night-reading-go.git (fetch)
origin	https://github.com/$user/night-reading-go.git (push)

$ git remote add upstream https://github.com/talkgo/night.git
$ git remote -v
origin	https://github.com/$user/night-reading-go.git (fetch)
origin	https://github.com/$user/night-reading-go.git (push)
upstream	https://github.com/talkgo/night.git (fetch)
upstream	https://github.com/talkgo/night.git (push)

# Never push to upstream master since you do not have write access.
$ git remote set-url --push upstream no_push
$ git remote -v
origin	https://github.com/$user/night-reading-go.git (fetch)
origin	https://github.com/$user/night-reading-go.git (push)
upstream	https://github.com/talkgo/night.git (fetch)
upstream	no_push (push)
```

### 第三步:分支

让你本地 master 分支保持最新:

```sh
$ cd $working_dir/night-reading-go
$ git fetch upstream
$ git checkout master
$ git rebase upstream/master
```

从 master 开分支:

```sh
$ git checkout -b myfeature
```

### 第四步:开发

#### 编辑代码

你现在能在 `myfeature` 分支上编辑代码/文档了。

请按照以下一些格式编写:

文件命名:`2018-08-03-contributing.md`;
文件的图片:放到 `static/images` 下;
文件内容:需要明确标题、日期等基本信息;

### 第五步:保持分支同步

```sh
# While on your myfeature branch.
$ git fetch upstream
$ git rebase upstream/master
```

### 第六步:提交

提交你的修改:

```sh
$ git commit
```

请参考 [Git Commit 规范指南](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit?pref=2&pli=1#)。

### 第七步:推送

准备好审核:

```sh
git push -f origin myfeature
```

### 第八步:创建一个 pull request

1. 访问你 fork 的 [https://github.com/$user/night-reading-go](https://github.com/$user/night-reading-go) (替换 $user);
2. 点击 myfeature 分支旁边的 Compare & pull request 按钮;

### 第九步:获取代码审核

一旦你的 Pull Request 被打开,它将被分配给审核者。
这些审核人员将进行彻底的代码审查,寻找正确性,错误,改进机会,文档和评论以及样式。



================================================
FILE: CONTRIBUTORS
================================================
yangwenmai
mougeCM
yuhao5
charnlsxy
AceDarkknight
gnuos
KISSMonX
dumliu01
hlily2005
henrylee2cn
shaqsnake
TBWISK
toontong
zhongxuan123
zhouxinxin19920802
macaria
DennisMao
orangle
HarbinZhang
SwanSpouse
mickey0524
zhuzhenfeng-finogeeks
xujiajun
NichoZhang
NichoZhang
qclaogui
john-deng
jeasonstudio
xpzouying
zsy619
yangfan21
hundredlee
mlboy
liangyuanpeng
abcdsxg
ziyi-yan
lpflpf
EDDYCJY
feirie
jukylin
feifeiiiiiiiiiii
cuishuang
JasonRD
itcuihao
wangriyu
Littlesqx
mchangxin
Hokkaitao
LIYINGZHEN
wty4427300
davygeek
changkun
LinkinStars
azd1997
dayuoba
scylhy
sober-wang
xhochipe


================================================
FILE: HISTORY.md
================================================
## Go 夜读发展历史

>Go 夜读起源于 Go 语言学习,提升团队 Go 语言技术能力水平,营造一些 Go 语言学习的氛围,但是在公司内部坚持了几周之后,就因为赶项目搁置了。后面项目稍微闲暇之后,就又重启此项目,不过经过这一段时间的中断,我也有了新的思考,为何不将此活动对外,并且以开源项目的方式运作呢?说不定可以帮助到更多的人。所以,你们看到了 Go 夜读项目。

### 第一阶段

1. 在 gocn.io 社区发帖,然后组织了第一批有兴趣的人;
2. 然后是朋友推荐和一些慕名而来人,这个时期完全是自由发展;
3. 因为内容做的还不错,包括微信群的日常讨论的总结;
4. 得到几个大 V 的 star,然后自然引流(appleboy, Windy);
5. 因为『Go 夜读』线下活动大家都有很多的收获,然后我们还将每期学到的知识进行总结,不久就得到了 [gocn.io](http://gocn.vip) GoCN 每日新闻的推广。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-github-trending_20180518142500.png)

**掘金:**

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-juejin_20180517115400.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-juejin_20180518090800.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-juejin_20180518142500.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-juejin_20180522152100.png)

发展时间:从 2018-03-21 到 2018-06-28

>由于场地以及时间的关系,将『Go 夜读』调整为每周四晚上线上活动(zoom.us)。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-star_20180516110400.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-star_20180516115000.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-star_20180518142500.png)

### 第一阶段(二)

2018-05-25 开通 YouTube,并上传了 Go 夜读的第一个视频《#7 http 包源码阅读 part1》,不过第一次上传这个视频时没有做剪辑,所以这一期视频在后面是单独又上传了一次。

----

### 第二阶段

1. 2018-07-12 开始调整为 zoom 线上 Go 夜读活动。

----

### 第三阶段

1. 2018-07-22 发布了一篇文章『Golang 代码质量持续检测』,2018-07-24 得到了几个 Go 群的推广;
2. 2018-07-24 上了 Trending ;
3. 2018-07-24 微信群达到 333 人;
4. 2018-07-26 Star 达到了 650 ;

**Github Trending:**

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-github-trending_20180724203600.png)

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-github-trending_20180726204300.png)

----

1. 2018-08-06 持续在 Go 语言的 Trending 上;
2. 2018-08-06 微信群达到了 439 人;
3. 2018-08-06 Star 达到了 866 ;

----

1. 2018-08-07 15:05:00 项目得到了[无闻大大](https://github.com/Unknwon)的 Star,直接带来了几十人的 Star,而且还在持续增长中,谢谢大家的认可;
2. 2018-08-07 16:31:00 微信群达到了 445 人;
3. 2018-08-07 16:31:00 Star 达到了 913 ;
4. 2018-08-08 17:08:00 Star 达到了 1067 ;

----

### 第四阶段

>[Go 夜读](https://talkgo.org/)终于有自己的官方网站了。

从 2018-09-27 在 issue 中提出[自动更新 README 脚本化](https://github.com/talkgo/night/issues/58),到最近[将项目中的文章自动同步构建网站](https://github.com/talkgo/night/issues/74)

在这里我要非常感谢 @john-deng ,是你第一次提出来,也是你在一直改进我们的官网。

昨天(2018-12-04)的 GrowingIO 数据:

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/2018-12-04-gio.png)

### 第四阶段(二)

2019-01-10 开通了 bilibili,考试成绩 74分。
随后上传了《#26 手把手教你基于 Github+Netlify 构建自动化持续集》。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/bilibili_kaoshi.png)

----

### 第五阶段

Go 每日阅读特训营。

有同学提到了 GoCN 每日新闻,我突然想到,能不能针对性来读一读呢?我日常也有阅读,但是都没有怎么讨论过。其实之前也有相关这样的话题---是否可以大家讨论一下,加深印象,但是一直没有做。

今天,我做出了第一步,结果如何我不知道,但是我相信,坚持就会有收获。

2019-03-13 22:00:00 在我发了 zoom.us 直播讨论群链接之后,主动进来的只有1个人。
>活动是彻底失败。

或许是我的方式不对吧!

>一个不太成功的试验,可能这也是为什么坚持那么难吧。

----

### 第六阶段

饶全成写了一篇新文章[深入Go的底层,带你走近一群有追求的人](https://www.cnblogs.com/qcrao-2018/p/10562216.html),给 Go 夜读狠狠的做了一次轰动的推广。

reading-go 再次登上 Github Go Trending 的排行榜。

### 第七阶段

经过自己的思考,我重新调整了 Go 夜读的选题,以及协同方式。

详情可参见:2019.04.13 https://github.com/talkgo/night/issues/348

### 第八阶段

在经过一段时间的试用,以及对话题的沉淀,预备了几个话题开始分享和讨论。(开始重度推荐 Slack 深度讨论)

将分享文章同步发布到以下平台:gocn.vip studygolang.com v2ex.com zhihu.com 微博

star 数开启于:2800

### 第九阶段

在2019年5月20日疑似得到 CSDN 上的 Github 精选的推广,增长了200多颗星。(截止到5月20日下午5点)。
>持续关注此次增长。

截止到晚上19:07,增长了300多颗星。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/trending_go.jpg)

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/trending_developers.jpg)

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/trending_repos.jpg)

2019年5月21日,B站关注数猛增150多人,达到1070多人的关注。
2019年5月21日,YouTube关注订阅达到968人,近千人的关注。
>非常感谢大家对于Go夜读的支持,欢迎大家积极参与 issue 来发起相关话题的讨论。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/reading_go_bilibili.jpg)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/reading_go_youtube.jpg)

截止到 2019年5月21日 09:15:00

star:3361,B站:1084,YouTube:971

后面我得知,这一波增长的源头是 Github 精选推荐了 Go 夜读,然后这个推荐又发布在微博上,微博上的蒋涛CSDN又转发了一波,CSDN 又转发了,所以就有了一定传播效应。所以最终得到了较大范围的曝光。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/weibo_github_daily.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/weibo_jiangtao_csdn.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/weibo_csdn_other_forward.png)

截止到 2019年5月21日 18:19:00

star:3504,B站:1119,YouTube:993

这一波推广,不单单是在 Go 语言排名靠前,而且在所有语言中也有一定的排名靠前,包括开发者排名也靠前。

Github Trending:

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/github_trending_go_0521.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/github_trending_developer_0521.png)

2019年5月21日 21:25 YouTube 突破 1000:

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/reading_go_youtube_1001.jpg)

截止到 2019年5月23日 09:38:00

star:3643,B站:1184,YouTube:1030

截止到 2019年7月18日 09:54:00

star:4278,B站:2026,YouTube:1335

----

## 第十阶段

2019-08-05 开放 Go 夜读 SIG 核心成员的招募。(地址:https://github.com/talkgo/night/issues/443)

2019-08-07 组建了 3 个人的 SIG 核心小组。
>小组成员:[yangwenmai](https://github.com/yangwenmai), [changkun](https://github.com/changkun), [FelixSeptem](https://github.com/FelixSeptem)

2019-08-21 第 4 个小伙伴加入 Go 夜读 SIG 核心小组。
>新增小组成员:[qcrao](https://github.com/qcrao)

2019-08-29 第 5 个小伙伴加入 Go 夜读 SIG 核心小组。

>新增小组成员:[煎鱼 - EDDYCJY](https://github.com/EDDYCJY)

截止 2019-09-09 的一些数据:

GitHub Star:4702,B站:2848 粉丝,YouTube:1589 订阅

----

## 第十一阶段

2019-11-05 有小伙伴在北邮人论坛发了一个帖子:https://bbs.byr.cn/#!article/Linux/158901

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/beijing-youdian-university.png)

带来了一波北京邮电大学的小伙伴们,也顺带激发了 Github trending,继而 star 增长。

Github Trending Go 语言第 2,全语言第 9 名。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-today-trending_go_no2_20191107.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-weekly-trending_go_no10_20191107.png)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-today-trending_all_no9_20191107.png)

还有 Github Traffic 的一个小统计:
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-traffic_20191107.png)

发现一个很有趣的事情就是 Go 夜读被放到了 https://allcontributors.org/ 首页上了。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/allcontributors-night-reading-go-20191107.jpg)

附上一张 Growingio 过去 180 天 https://talkgo.org/ 的统计图:

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-180ags-growingio_20191107.png)

截止 2019-11-07 的一些数据:

GitHub Star:5352,B站:3991 粉丝,YouTube:1840 订阅

----

## 第十二阶段

启用 Go 夜读公众号作为我们活动的日常预告、开始通知、视频回顾和 QA 纪要,以及一些推荐文章。

2019-11-18 在 Go 夜读公众号上发布了一篇『加入 Go 夜读』的文章,在当天晚上和第二天早上就有大量的 Gopher 用户转发此文章,在微信朋友圈得到了大量的自发性的转发。
>入群的小伙伴络绎不绝,从11月18日到11月20日,新增微信用户不少于 200 人。(加人加到手抽筋啊,不得不吐槽一下微信的加入和标签真的是太垃圾了。---机器人加人涉及到可能被封号,所以一直没有研发机器人)

『加入 Go 夜读』也很快突破了 2000 的阅读量,很感谢大家对 Go 夜读的支持,我们 Go 夜读 SIG 小组一定会将活动越办越好。

2019-11-20 下午 6 点多,看到一篇文章( BFE 上 go trending TOP 3),我就顺便去看了 trending,一眼就看到了咱们的 Go 夜读项目,在 daily go trending 的第 4 位,心里一顿开心。
>其实,我在19日还特定关注了一下 trending 的,毕竟 Go 夜读公众号带来了好几百的订阅和微信群新增用户,想着 Github 应该会上个 trending 吧,没想到是我想多了。

现在看来,应该是 GitHub 是有时延吧。

截止 2019-11-20 的一些数据:

GitHub Star:5489,B站:4281 粉丝,YouTube:1940 订阅

----

Go 夜读又上 Github Trending Go 榜单了,现目前排名第 3。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/night-reading-go-today-trending_go_no3_20191205.png)

截止 2019-12-05 的一些数据:

GitHub Star:5686,B站:4683 粉丝,YouTube:2050 订阅

## 第十三阶段

从 2019-12-06 到 2020-03-11,在这期间,有好几次增长吧。

中间也经过一个春节,我印象比较深的是,Go 夜读发了一期『2020 年 Go 的一些发展计划』以及公众号『Go 1.14 发布啦!』带来了公众号粉丝的增长。

当前在此期间的,好几期分享都非常棒。

## 第十四阶段

Go 夜读第 78 期『加餐』『Go Scheduler 源码分析』,第一次尝试在 Bilibili 上进行直播。

人气最高有 1490 左右,一个小小的里程碑吧。

截止 2020-03-11 的一些数据:

GitHub Star:6520,B站:7469 粉丝,YouTube:2830 订阅

## 第十五阶段

又是一周双响,先是周三由欧神给我们带来的『第 80 期带你提前玩 Go 2 新特性:泛型』,然后是 gorm 作者 Jinzhu 大佬给我们带来的『第 81 期 gorm 介绍与展望』。

zoom 直播,100人的房间均被快速的占满,在 bilibili 的直播上,人气也是越来越高。

最高人气 3500 多,bilibili 粉丝数量达到 8000,又是给 Go 夜读创下一个里程碑。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/bilibili-fans-8000-20200320.jpg.jpg)

再次感谢各位讲师以及参与收看的小伙伴们。

## 第十六阶段

2020-03-21 Go 夜读正式举行两周年的日子,当天不会有什么活动,但是会发布一篇两周年纪念日的公众号文章。这是 SIG 小组成员的寄语:

@杨文:坚持做有价值的事。

@changkun:无独有偶,惊觉自己第一次接触 Go 的时间正好也是两年前的今天,可能这就是冥冥之中与 Go 夜读结下的缘分吧。

@felix:积跬步,至千里。在 Go 夜读平台上收获成长,分享知识,和广大 Gopher 一起成长,impact more!

@qcrao:我记得曹大说过一句话,如果没有“影响力”的话,基本上在职场上就是任人宰割。写博客、来夜读分享都可以是扩大自己影响力的途径!希望每个人都能在自己的圈子构建自己的影响力!

@煎鱼:坚持踏出每一步,你就能不断的看到来自未来的新选项,新分支。而 Go 夜读就是一个很好的平台,来试试吧,这是一份技术,沟通,演讲的三倍快乐。

希望 Go 夜读可以持续的给大家带来帮助,大家可以从 Go 源码的学习中获得收益。

截止 2020-03-24 ,两周年的微信公众号文章给 Go 夜读带来了约 300 名订阅者,以下是最近 200 名订阅者的截图。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/2020-03-24-night-reading-go-wechat-subscripter.png)

2020-03-24 登上 Github Trending daily 第 2 名,weekly 第 4 名,monthly 第 8 名。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/2020-03-24-github-trending-go-daily-no2.jpg)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/2020-03-24-github-trending-go-weekly-no4.jpg)
![](https://raw.githubusercontent.com/talkgo/night/master/static/images/2020-03-24-github-trending-go-monthly-no8.jpg)


## 第十七阶段

2020-03-26 我们将项目改为 `talkgo/night` 了,相比之前更简单,更好记,也更有意义。

## 第十八阶段

2020-04-05 Go 夜读,有了英文名 TalkGo,并且也在其他各个社交平台开通了。

[Facebook](https://www.facebook.com/groups/talkgo/), [Twitter](https://twitter.com/talkgo_night), [YouTube](https://youtube.com/c/talkgo_night), [Slack](https://talkgo.slack.com), [Telegram](https://t.me/talkgo)

## 第十九阶段

2020-05-12 Go 夜读 Bilibili 关注数突破 1 万,达到一个新的里程碑。

截止 2020-05-12 的一些数据:

GitHub Star:7313,B站:10001 粉丝,YouTube:3350 订阅

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/bilibili_1w_chengjiu.jpg)

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/bilibili_1w_screenshot.png)

## 第二十阶段

好事成双,今天(2020-05-12)我们还开通了[TalkGo 社区网站](https://talkgo.org/)。

## 第二十一阶段

2020-06-29 ,在[aofei](https://github.com/aofei)同学的帮助下,TalkGo 的 GitHub Repo 用户名正式更换为 talkgo 了,全平台统一,看起来也非常舒服了。

## 第二十二阶段

2020-07-01 第 6 个小伙伴加入 Go 夜读 SIG 核心小组。

>新增小组成员:[aofei](https://github.com/aofei)

## 第二十三阶段

2020-07-23 由曹大在 Go 夜读分享《第 97 期我们可以从 mosn 和相关的项目中学习到什么》,按照惯例,我们的分享将在 zoom 和 bilibili 上直播,由于网络原因,现在上 zoom 的小伙伴已经比较少了,大家都是 bilibili,非常方便就可以接入,今天我们的 b站人气一路狂奔,1000、2000、5000、1万、2万,迅速累计超过2万,最高时人气将近3万,创下了 Go 夜读有史以来最高人气。

在分享开始之前,Jimmysong 还在云原生和 ServiceMesh 各群进行了转发,带来了不少的人气,在分享过程中 Jimmysong 也是有问必答。

感谢曹大和 Jimmysong 的分享和答疑。

## 第二十四阶段

2020-08-13 Go 夜读第 100 期分享《如何高效的阅读 Go 代码?》
>更多分享内容:https://talkgo.org/t/topic/623

## 第二十五阶段

2020-08-20 Go 夜读微信群内发起投票:你知道 talkgo.org 网站吗?
- 知道 70%
- 不知道 30%

从实际结果可以看出,至少有 30% 的人是不怎么看微信群内的消息的。
>因为 talkgo.org 这个网站基本上每一周都会发一次。(Go 夜读是一个“周更”节目。)

随后,Go 夜读又发起并组件了一支 [Go 夜报](https://github.com/talkgo/newspaper)的志愿者小队伍,咱们将会持续为广大程序员(Gopher)输出更多更好更有价值的内容。
>截止到 2020-08-21 0 点,已经有超过 25 个人报名。

## 第二十六阶段

2020-09-24 Go 夜读公众号将尝试以文字稿的方式呈现已分享内容。
第 104 期手撕 hashicorp/raft 算法是由 [YouEclipse](https://github.com/YouEclipse) 负责整理,并且还输出了相关文字稿整理的草案。

## 第二十七阶段

2021-04-16 Go 夜读 SIG 小组解散。

## 第二十八阶段

2021-05-20 Go 夜读公众号开放招聘,不定期发布优质的企业招聘信息。

## 第二十九阶段

2021-05-20 Go 夜读 bilibili 粉丝数达到 2 万,YouTube 订阅数 4.98K。

## 第三十阶段

2021-12-09 Go 夜读 GitHub Star 数正式突破 1 万。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/2021-12-09-talkgo-night-10000-star.png)

Go 夜读 bilibili 粉丝数达到 2.5 万,YouTube 订阅数 5.82K。

Go 夜读更新到第 123 期。

## 第三十一阶段

2022-03-20 Go 夜读 Bilibili 累计播放量破 50 万。

2022-03-21 Go 夜读四周年活动,线上活动邀请了果果担任活动的主持人。

讲师嘉宾邀请了 20 位业界大佬的参与,详细活动内容可以[点击链接](https://talkgo.org/t/topic/3564)

## 第三十二阶段

2022-04-14 Go 夜读 Bilibili 粉丝数达到 3 万,YouTube 订阅数 6.3K。

## 第三十三阶段

2022-05-21 Go 夜读 Bilibili 粉丝数达到 3.1 万,YouTube 订阅数 6.4K。

Go 夜读更新到第 132 期。

## 第三十四阶段

2022-06-09 Go 夜读 Bilibili 粉丝数达到 3.2 万,YouTube 订阅数 6.5K。

Go 夜读更新到第 133 期。

## 第三十五阶段

2022-08-14 Go 夜读 Bilibili 粉丝数达到 3.3 万,YouTube 订阅数 6.7K。

Go 夜读更新到第 138 期。

## 第三十六阶段

2022-10-21 Go 夜读 Bilibili 粉丝数达到 3.4 万,YouTube 订阅数 6.8K。

## 第三十七阶段

2022-11-24 Go 夜读 Bilibili 粉丝数达到 3.5 万,YouTube 订阅数 6.97K。

## 第三十八阶段

2022-12-31 Go 夜读 Bilibili 粉丝数达到 3.6 万,YouTube 订阅数 7.04K。

2022 年我一共发布了 23 个视频,累计时长 21 小时,总播放量达 10.2 万 次,累计获赞 3705 次,单集最高播放 2.7 万,2022 年有 9721 位小伙伴关注了我。

## 第三十九阶段

2023-02-09 Go 夜读 Bilibili 粉丝数达到 3.7 万,YouTube 订阅数 7.11K。

## 第四十阶段

2023-03-12 Go 夜读更新到第 142 期,

[talkgo/night](https://github.com/talkgo/night) commits 达到 1,000。

![](https://raw.githubusercontent.com/talkgo/night/master/static/images/talkgo_zsxq_category.png)

从上周(2023-03-05)开始,陆陆续续给咱们的讲师和知识星球星友们邮寄了 5 周年 T恤衫,不少伙伴已经收到衣服,试穿反馈还不错。

## 第四十一阶段

2023-06-27 Go 夜读视频号获赞 1000 。
2023-06-29 Go 夜读更新到第 146 期。
2023-06-29 Go 夜读 Bilibili 粉丝数达到 3.9 万,YouTube 订阅数 7.31K。

## 第四十二阶段

2023-08-14 Go 夜读视频号视频观看次数破 2.2 万。
2023-08-17 Go 夜读 Bilibili 粉丝数达到 4 万,YouTube 订阅数 7.39K。

## 第四十三阶段

2024-01-25 Go 夜读更新到第 150 期。
2023-01-25 Go 夜读 Bilibili 粉丝数超过 4 万,YouTube 订阅数达到 7.6K。

## 第四十四阶段

2024-05-23 Go 夜读更新到第 152 期。
2023-05-23 Go 夜读 Bilibili 粉丝数超过 4.1 万,YouTube 订阅数达到 7.7K。

2024-05-23 Go 夜读将多个不活跃的微信群直接解散,「断舍离」。只服务真正有价值意义的群。不活跃,也不参与互动的群,留着也只是一种负担。

## 第四十五阶段(AI 新纪元)

2024-07-20 Go 夜读更新到第 157 期。
2024-11-17 Go 夜读全平台更名为:「Go 夜读 AI 探索者」。
- 每周五晚上 21 点,视频号、B 站上线上直播 VIP 群友实战分享交流。
2024-11-22 Go 夜读 Bilibili 粉丝数超过 4.2 万,YouTube 订阅数超过 7.8K。


================================================
FILE: JOINUS.md
================================================
# 如何加入 Go 夜读 SIG 小组?

>已不再纳新。

你可以联系 Go 夜读 SIG 小组成员,最好准备以下内容:

1. 完整的自我介绍,包括:
- 个人信息
- 工作内容
- 个人爱好
- 对开源社区有哪些贡献?
- 演讲的能力或经验
2. 你能为 SIG 小伙伴带来什么?
- 你有什么优势
- 你可以提供什么有价值的输出?
3. 你希望从这里获得什么?

## 加入规则

Go 夜读 SIG 小组成员全员通过才能加入。

## 退出机制

主要有两种:
- 自己申请退出。
- 连续 2 个月未参加小组活动,可考虑自行退出。


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020 talkgo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
HUGO = hugo

all: clean
	$(if $(shell PATH=$(PATH) which $(HUGO)),hugo -D --minify,$(error "No $(HUGO) in PATH"))

clean:
	rm -rf public resources

================================================
FILE: README.md
================================================
<img src="https://raw.githubusercontent.com/talkgo/night/master/static/images/2018-12-11-night-reading-go.jpg" alt="logo" height="120" align="right" />

# [Go 夜读](https://talkgo.org/)

[![Go Report Card](https://goreportcard.com/badge/github.com/talkgo/night?style=flat-square)](https://goreportcard.com/report/github.com/talkgo/night)
[![GitHub stars](https://img.shields.io/github/stars/talkgo/night.svg?label=Stars&style=flat-square)](https://github.com/talkgo/night)
[![GitHub forks](https://img.shields.io/github/forks/talkgo/night.svg?label=Fork&style=flat-square)](https://github.com/talkgo/night)
![](https://img.shields.io/github/contributors/talkgo/night.svg?style=flat-square&color=orange&label=all%20contributors)
[![Documentation](https://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/talkgo/night)
[![GitHub issues](https://img.shields.io/github/issues/talkgo/night.svg?label=Issue&style=flat-square)](https://github.com/talkgo/night/issues)
![](https://changkun.de/urlstat?mode=github&repo=talkgo/night)
[![license](https://img.shields.io/github/license/talkgo/night.svg?style=flat-square)](https://github.com/talkgo/night/blob/master/LICENSE)

## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=talkgo/night&type=Date)](https://star-history.com/#talkgo/night&Date)

## 加入方法

### 微信群

微信搜索 `night_reading_go` ,添加好友,**备注你的姓名、公司、工作岗位和职责**,
来自:GitHub,我会拉你入群。

在群内大家会就一些话题进行深入交流和探讨,说不定你还能遇到你的“导师”,我相信你会在里面受益良多,希望这个收益可以让你也能积极参与讨论,让微信群因你的加入而更精彩。

### 知识星球

<div>
	<img src="https://raw.githubusercontent.com/talkgo/night/master/static/images/talkgo_zsxq_category.png" width="240px;"/>
	<img src="https://raw.githubusercontent.com/talkgo/night/master/static/images/talkgo_zsxq_share.jpg" width="340px;"/>
</div>

2023 年,[我的回顾与启航:从心出发](https://mp.weixin.qq.com/s/1yoBdUGgwviPcpswJRMhtQ)。

2024 年,「保持好奇心,向 AI 进发」。

每一年,我们会为大家创建专门的微信群,在这里不仅会有知识星球内容提醒,还会有 Go 夜读各位讲师,你可以直接跟他们沟通。

在知识星球中,我们会放出「Go 夜读」每一期分享内容的资料。

我们的知识星球合伙人、嘉宾、资深工程师们,还会不定期的分享他们的精彩内容,以及他们的精彩分析。

除此之外,我们还筹备了以下专栏(相比于 2023 年,我们做了精简,以求做好):

- #连接你我 通过 1:1 深度连接你,帮你走出精彩的职场之路。
- #成长手记 讲述我在经营「Go 夜读」过程中的一些经历。
- #好书共读 从书中学,书中自有黄金屋,书中自有颜如玉。我不是一个阅读达人,但是我会通过 #21天读书打卡 方式,认真读完每一本书,也会认真写下我的读后感。
- #从听中学 对于一个每个月收听超过 50 小时的重度播客听众来说,有太多精彩的内容和洞察想要与人分享、交流。从听(播客、视频)中学习行业大咖的经验和总结。
- #以练代学 开源项目的实践,7 天系列,30 天系列,效率工具,效率提升等。
- #管理手记 在现代管理学之父德鲁克看来,我们每一个人都是管理者,也会分享一些管理洞见,希望可以相互交流。
- #私享会 #星友局 属于我们自己的聚会。

我们的使命、愿景、价值观
- 使命:让每个开发者都能成长
- 愿景:深度连接 10000 个开发者
- 价值观:真诚、互助、尊重

欢迎你直接联系我或者提 Issues。

### 订阅 Go 夜读微信公众号

<img src="https://raw.githubusercontent.com/talkgo/night/master/static/images/wechat_logo/talkgo.png" width="860px;"/>

Go 夜读微信公众号主要是 Go 语言相关的话题,例如 Go 新特性分析, Go 周边新闻,Go Proposal解读, Go 源码剖析,以及 Go 工程实践。

Go 夜读还包括读书会和算法学习板块,读书会偶尔会有读书笔记分享,也有共读共学的读书会活动。
算法学习主要是以题解讨论形式在小范围内进行,偶尔会分享一些题解以供学习交流。

### YouTube, Twitter, Facebook, Telegram, Slack

[![](https://img.shields.io/badge/YouTube-Go%20%E5%A4%9C%E8%AF%BB-2ca5e0?style=for-the-badge&logo=youtube)](https://youtube.com/c/talkgo_night)
[![](https://img.shields.io/badge/Twitter-Go%20%E5%A4%9C%E8%AF%BB-2ca5e0?style=for-the-badge&logo=twitter)](https://twitter.com/talkgo_night)
[![](https://img.shields.io/badge/Facebook-Go%20%E5%A4%9C%E8%AF%BB-2ca5e0?style=for-the-badge&logo=facebook)](https://www.facebook.com/groups/talkgo/)
[![](https://img.shields.io/badge/Telegram-Go%20%E5%A4%9C%E8%AF%BB-2ca5e0?style=for-the-badge&logo=telegram)](https://t.me/talkgo)
[![](https://img.shields.io/badge/Slack-Go%20%E5%A4%9C%E8%AF%BB-2ca5e0?style=for-the-badge&logo=slack)](https://join.slack.com/t/talkgo/shared_invite/zt-89zh1000-KX2tZ6l~FSNP14Oy2B~onQ)

## 我们的精神

**开源!开源!开源!**

重要的事,一定要说三遍。

希望有兴趣的小伙伴们一起加入,让我们一起把 『Go 夜读』建立成一个对大家都有帮助的开源社区。

## 我们的目标

我们希望可以推进大家深入了解 Go ,快速成长为资深的 Gopher 。
我们希望每次来了的人和没来的人都能够有收获,成长。

让每个想要学习的人都能参与进来,(包括初中高级 Go 工程师),
只有层次相当的人才有可能有思维的碰撞和交流,这样最终的产出也尽可能的高质量。

## 主题内容

Go 夜读将定期进行与 Go 语言相关的话题分享,例如源码阅读、工程实践等等。

- 如果你是一个 Go 新手,推荐阅读:[Go 学习之路](https://github.com/talkgo/read)
- 如果你对 Go 语言的历史比较感兴趣,强烈推荐阅读:[Go: A Documentary](https://golang.design/s/gohistory-talkgo)

### 我们的选题范围

我们的选题范围包括但不限于:

- 入门级
- 实操级
- 架构设计级
- 学习方法、习惯培养等
- 效率效能提升
- 论文研讨

### 我们的基本流程和分享方式

1. 通过提交 Issue 的方式来收集大家想要研究的与 Go 相关的源码库或源码模块等话题;
2. 提交的话题提案必须得到得到 SIG 小组的批准,并成功招募到分享人,该分享才会进入准备阶段。同样欢迎自荐话题并主动进行分享;
3. 分享人准备分享材料,并在材料准备完毕后交付 SIG 小组审阅;
4. 当 SIG 小组完成对材料的审阅后,将进行正式排期(这期间包括划定受众范围、审阅任务分工、分发排期计划等);
5. 正式在线上进行分享;
6. 将视频进行后期剪辑并上传至视频网站,再进行后续分发。

**注:**

报名讲师并完成分享后,我们将赠送「Go 夜读」知识星球赠票。

### 回看地址

- [Go 夜读(YouTuBe)](https://youtube.com/c/talkgo_night)
- [Go 夜读(Bilibili)](https://space.bilibili.com/326749661)
- ~Go 夜读(腾讯视频)~ 已不再更新

### 往期分享

| 期数  | 标题                                                                                                            | 分享人                                                                                                                                                                                         | 回看                                                                                                                                                   |
| :---: | :-------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
|  157  | [2024-07-20 从 0 到 1 用 Claude.ai 开发个人作品集网站](https://talkgo.org/t/topic/5703)                                          | qcrao。微信公众号《码农桃花源》作者,Go 夜读 4 期分享者(本期第五期^_^) | [YouTube](https://youtu.be/X4lm4iA-9Ao) [Bilibili](https://www.bilibili.com/video/BV1bW42197r8/)                                                        |
|  156  | [2024-07-02 如何设计一个分布式数据实时同步系统](https://talkgo.org/t/topic/5634)                                          | 彭亮,专注于基础架构和中间件开发 | [YouTube](https://youtu.be/3-MXj95vviQ) [Bilibili](https://www.bilibili.com/video/BV1FE421P71f/)                                                        |
|  155  | [2024-06-16 ](https://talkgo.org/t/topic/5556)                                          | 小徐先生@滴滴出行,营销业务,Go 后端研发 | [YouTube](https://youtu.be/9kHScd5w-_g) [Bilibili](https://www.bilibili.com/video/BV1mf421B7py/)                                                        |
|  154  | [2024-06-06 建立理解分布式系统的框架](https://talkgo.org/t/topic/5591)                                          | 木鸟,常用网名“木鸟杂记”。 | [YouTube](https://youtu.be/zx3r_JO7e2Y) [Bilibili](https://www.bilibili.com/video/BV1PE421N7aN/)                                                        |
|  153  | [2024-05-28 chDB: In-Process ClickHouse 引擎](https://talkgo.org/t/topic/5528)                                          | auxten, Technical Director of ClickHouse core team | [YouTube](https://youtu.be/rn_Al4JTgzU) [Bilibili](https://www.bilibili.com/video/BV1cr421A71B/)                                                        |
|  152  | [2024-05-23 从汇编角度理解 Go 语言](https://talkgo.org/t/topic/5541)                                          | 挖坑的张师傅,来自希沃,负责 DevOps、多云架构等相关的工作 | [YouTube](https://youtu.be/4vDV4EWjNNg) [Bilibili](https://www.bilibili.com/video/BV14U411o7ZU/)                                                        |
|  151  | [2024-05-16 xgo: 基于编译期代码重写实现 Mock 和 Trace](https://talkgo.org/t/topic/5514)                                          | xhd2015, 先后经历 vivo,字节跳动,目前在一家外企从事 Go 的研发工作。 | [YouTube](https://youtu.be/PFU51LOaj-4) [Bilibili](https://www.bilibili.com/video/BV11D421A7zW/)                                                        |
|  150  | [2024-01-25 Go 并发模式介绍和创新创造](https://talkgo.org/t/topic/5365)                                          | 鸟窝,微服务框架 rpcx 的作者,《深入理解 Go 并发编程》的作者,《100 个 Go 典型错误》的译者之一,新技术的爱好者。 | [YouTube](https://youtu.be/AfTyEUHyyGs) [Bilibili](https://www.bilibili.com/video/BV1Fw41177tk/)                                                        |
|  149  | [2024-01-18 如何设计现代云原生网关:Easegress](https://talkgo.org/t/topic/5350)                                          | 龙韵,软件工程师,来自 MegaEase。Easegress 与 EaseMesh 的架构师与开发人员。 | [YouTube](https://youtu.be/2M3MK_mUYBI) [Bilibili](https://www.bilibili.com/video/BV1Et4y1d7Nk/)                                                        |
|  148  | [2023-09-21 Excelize 构建 WebAssembly 版本跨语言支持实践](https://talkgo.org/t/topic/5127)                                          | 续日,软件工程师,开源爱好者 GitHub: [@xuri](http://github.com/xuri),Excelize 开源基础库作者。阿里巴巴技术专家,前百度 Go 语言编程委员会成员,从事百度 Go 语言研发体系的建设工作。 | [YouTube](https://youtu.be/hTc49BfDdtQ) [Bilibili](https://www.bilibili.com/video/BV1vw411e7w7/)                                                        |
|  147  | [2023-08-08 高性能预写日志(Write Ahead Log)的设计与实现](https://talkgo.org/t/topic/5016)                                          | [roseduan](http://github.com/roseduan),目前在 hashdata 担任数据库内核开发,开源爱好者,开源项目 rosedb、lotusdb、wal、renee 作者 | [YouTube](https://youtu.be/ZLzApE3MRFc) [Bilibili](https://www.bilibili.com/video/BV1V44y1A7Mx/)                                                        |
|  146  | [2023-06-29 基于 Zinx 的 TCP Server 开发](https://talkgo.org/t/topic/4926)                                          | Aceld,Zinx 作者,《深入理解 Go 语言》作者 | [YouTube](https://youtu.be/1GY0Jje3GGU) [Bilibili](https://www.bilibili.com/video/BV1HF411o76n/)                                                        |
|  145  | [2023-06-15 go-zero 实战经验分享](https://talkgo.org/t/topic/4876)                                          | Mikael go-zero-looklook 作者 | [YouTube](https://youtu.be/bHLUCyY8WtI) [Bilibili](https://www.bilibili.com/video/BV1CP411i7ic/)                                                        |
|  144  | [2023-04-06 如何快速学习 Go 语言设计模式](https://talkgo.org/t/topic/4733)                                          | 廖显东,《Go 语言设计模式》作者 | [YouTube](https://youtu.be/hsJvX61tKgQ) [Bilibili](https://www.bilibili.com/video/BV1SL411U7Zh/)                                                        |
|  143  | [2023-03-23 从零开始的高性能RPC框架设计与实现](https://talkgo.org/t/topic/4679)                                          | rainstorm,开源爱好者,https://github.com/zbh255 | [YouTube](https://youtu.be/QFTIahfEJag) [Bilibili](https://www.bilibili.com/video/BV13c411L7D2/)                                                        |
|  142  | [2023-03-12 如何用 things 3 管理我们的工作和生活?](https://talkgo.org/t/topic/4672)                                          | qcrao | [YouTube](https://youtu.be/fFkOSjBkIQc) [Bilibili](https://www.bilibili.com/video/BV1p24y1g7A6/)                                                        |
|  141  | [2022-11-24 KusionStack:"后云原生时代"应用模块化运维管理解决方案](https://talkgo.org/t/topic/4334)                                          | 李大元 (花名:达远) Kusion 项目负责人,蚂蚁集团 PaaS 核心团队技术专家,PaaS IaC 基础平台负责人 | [YouTube](https://youtu.be/00AcKBiH828) [Bilibili](https://www.bilibili.com/video/BV1Vv4y127Re/)                                                        |
|  140  | [2022-11-16 Go 1.19 pdqsort 算法](https://talkgo.org/t/topic/4342)                                          | 张云浩@字节跳动 | [YouTube](https://youtu.be/H5ZFQbNW61g) [Bilibili](https://www.bilibili.com/video/BV1oG4y1x7xN/)                                                        |
|  139  | [2022-11-03 Go 语言 Excelize 开源基础库介绍](https://talkgo.org/t/topic/4334)                                          | 续日,软件工程师 | [YouTube](https://youtu.be/kG4F1YK2Eec) [Bilibili](https://www.bilibili.com/video/BV1K84y1q76p/)                                                        |
|  138  | [2022-07-28 Go 语言链接器](https://talkgo.org/t/topic/4043)                                          | 史斌@Go 语言核心贡献者(TOP 50) | [YouTube](https://youtu.be/whcrrG3fwu8) [Bilibili](https://www.bilibili.com/video/BV1wS4y1b73Q/)                                                        |
|  137  | [2022-07-27 如何学习开源项目——从全局到局部分析的思路](https://talkgo.org/t/topic/4039)                                          | 李纪昀@CloudWeGo CSG Member | [YouTube](https://youtu.be/_2cowlNwv10) [Bilibili](https://www.bilibili.com/video/BV1xt4y1V7hb)                                                        |
|  136  | [2022-07-20 如何利用命令行工具 hz 快速开发 hertz 服务——hertz 框架实践](https://talkgo.org/t/topic/4014)                                          | 范广宇@字节跳动架构研发工程师 | [YouTube](https://youtu.be/raugX1XXwao) [Bilibili](https://www.bilibili.com/video/BV1GG4y1i7Cu)                                                        |
|  135  | [2022-07-13 从精通烤肉到精通 HTTP —— Hertz HTTP 框架入门](https://talkgo.org/t/topic/3996)                                          | 尹旭然@字节跳动架构研发工程师 | [YouTube](https://youtu.be/qEMwHUAYnQo) [Bilibili](https://www.bilibili.com/video/BV1ta411H7pe/)                                                        |
|  134  | [2022-06-30 JuiceFS 导出/导入元数据的优化之路](https://talkgo.org/t/topic/3949)                                          | 徐桑迪@JuiceData | [YouTube](https://youtu.be/MDMitDtLly4) [Bilibili](https://www.bilibili.com/video/BV1Pf4y1Z7k2/)                                                        |
|  133  | [2022-06-09 缓存与数据库一致的解决方案](https://talkgo.org/t/topic/3851)                                          | 叶东富 | [YouTube](https://youtu.be/xyVAY6Ia72Y) [Bilibili](https://www.bilibili.com/video/BV1Mg41197MM/)                                                        |
|  132  | [2022-04-21 TransactionMesh 的一种实现方案](https://talkgo.org/t/topic/3687)                                          | 刘晓敏,目前在中国系统从事云原生开发研究。主要开源项目 seata-golang。 | [YouTube](https://youtu.be/ScRkpEV4Lw0) [Bilibili](https://www.bilibili.com/video/BV1j541117Qo/)                                                        |
|  131  | [2022-04-14 gRPC-Go 基于 Polaris 北极星的服务治理实践](https://talkgo.org/t/topic/3661)                                          | 单家骏,腾讯专家工程师,具备10年以上中间件研发经验。北极星开源社区(PolarisMesh)联合发起人,负责北极星开源社区项目的技术规划、代码开发和社区运营等工作。 | [YouTube](https://youtu.be/xW4uRIiTlW8) [Bilibili](https://www.bilibili.com/video/BV1VY411j7ty/)                                                        |
|  130  | [2022-04-07 开源 KV 引擎 NutsDB 的设计与实现](https://talkgo.org/t/topic/3584)                                          | 徐佳军 | [YouTube](https://youtu.be/QDshdLi10aE) [Bilibili](https://www.bilibili.com/video/BV1T34y1x7AS/)                                                        |
|  129  | [2022-03-31 Go 本地缓存的技术选型对比(freecache、bigcache、fastcache)](https://talkgo.org/t/topic/3519)                                          | 文小飞 | [YouTube](https://youtu.be/pK-9enToXlU) [Bilibili](https://www.bilibili.com/video/BV1aL4y1L7Kk)                                                        |
|  128  | [2022-03-30 Go 1.18 中的泛型](https://talkgo.org/t/topic/3582)                                          | 欧长坤 | [YouTube](https://youtu.be/ICcss3KKq_0) [Bilibili](https://www.bilibili.com/video/BV1244y1A7BM/)                                                        |
|  127  | [2022-02-10 消息最终一致性的架构革命](https://talkgo.org/t/topic/3307)                                          | 叶东富,北京大学计算机硕士,曾任常青藤爸爸 CTO,曾任搜狗架构师。开源跨语言分布式事务管理器 dtm 作者;C++ 开源网络框架 handy 作者。在分布式事务、高可用、分布式共识、性能优化等领域有深入研究。 | [YouTube](https://youtu.be/FSBSpO46zxo) [Bilibili](https://www.bilibili.com/video/BV17S4y1C7CP)                                                        |
|  126  | [2022-01-18 Go 自底向上性能优化实践](https://talkgo.org/t/topic/3296)                                           | 韩森,开源爱好者,hnes@PingCAP                                                                                                                                                                 | [YouTube](https://youtu.be/1C-hxpxrnKQ) [Bilibili](https://www.bilibili.com/video/BV1GT4y127SC/)                                                       |
|  125  | [2022-01-13 The Tail At Scale(长尾耗时) & HotRing 论文阅读分享](https://talkgo.org/t/topic/3240)              | 陈子昌@滴滴 MPT                                                                                                                                                                                | [YouTube](https://youtu.be/Hg5n1A7chog) [Bilibili](https://www.bilibili.com/video/BV1jZ4y1f73f/)                                                       |
|  124  | [2021-12-22 go-zero 分布式事务实践](https://talkgo.org/t/topic/3196)                                            | 万俊峰 & 叶东富                                                                                                                                                                                | [YouTube](https://youtu.be/gN_XtJDs1Ks) [Bilibili](https://www.bilibili.com/video/BV1wi4y1R73Z/)                                                       |
|  123  | [2021-12-09 eBPF 与 Go,超能力组合](https://talkgo.org/t/topic/3111)                                            | 狄卫华 《Linux 内核观测技术 BPF》译者之一,云原生架构师                                                                                                                                        | [YouTube](https://youtu.be/JE_m2honA04/) [Bilibili](https://www.bilibili.com/video/BV19U4y1N7PM/)                                                      |
|  122  | [2021-11-24 7 天用 Go 从零实现系列背后的故事](https://talkgo.org/t/topic/3028)                                  | 极客兔兔,2017 年毕业于复旦大学,现任华为 OS 内核主任工程师。Go 语言业余爱好者,《 7 天用 Go 从零实现系列》作者。                                                                              | [YouTube](https://youtu.be/iCcQwaHhVgo) [Bilibili](https://www.bilibili.com/video/BV1yL4y1p7xX/)                                                       |
|  121  | [2021-11-04 微服务的数据一致性问题及解决方案 DTM](https://talkgo.org/t/topic/2925)                              | 叶东富,北京大学计算机硕士,曾任常青藤爸爸 CTO,曾任搜狗架构师。开源跨语言分布式事务管理器 dtm 作者;C++ 开源网络框架 handy 作者。在分布式事务、高可用、分布式共识、性能优化等领域有深入研究。 | [YouTube](https://youtu.be/0FZ1VWJl62w) [Bilibili](https://www.bilibili.com/video/BV1Fu411Z7LS/)                                                       |
|  120  | [2021-10-28 垃圾回收与 Go 实现](https://talkgo.org/t/topic/2916)                                                | 郑建勋,《Go语言底层原理剖析》作者                                                                                                                                                             | [YouTube](https://youtu.be/L-p0N4f_DUc) [Bilibili](https://www.bilibili.com/video/BV1tQ4y1q742/)                                                       |
|  119  | [2021-10-21 Go monkey patch 的原理及应用](https://talkgo.org/t/topic/2880)                                      | 涛叔@Bilibili,从事 Go 服务端研发工作                                                                                                                                                          | [YouTube](https://youtu.be/GgSFNZ1rsss) [Bilibili](https://www.bilibili.com/video/BV1CU4y1F7Vs/)                                                       |
|  118  | [2021-09-29 Go 字符串匹配及 Rabin-Karp 算法](https://talkgo.org/t/topic/2830)                                   | cuishuang,目前就职于B站,担任Go服务端开发师                                                                                                                                                   | [YouTube](https://youtu.be/30rufX6Azew) [Bilibili](https://www.bilibili.com/video/BV1Hb4y117vu/)                                                       |
|  117  | [2021-07-03 详解开源项目 rosedb 及存储模型](https://talkgo.org/t/topic/2386)                                    | roseduan/玫瑰哥@哔哩哔哩后台开发工程师                                                                                                                                                         | [YouTube](https://youtu.be/Knh7EYfVIKs) [Bilibili](https://www.bilibili.com/video/BV1ih411h7yC/)                                                       |
|  116  | [2021-06-17 理论结合实践详解 lsm 树存储引擎(bitcask、moss、leveldb 等)](https://talkgo.org/t/topic/2376)      | 文小飞@腾讯 PCG                                                                                                                                                                                | [YouTube](https://youtu.be/adamqSuHHck) [Bilibili](https://www.bilibili.com/video/BV16X4y1A7TV/)                                                       |
|  115  | [2021-05-27 理论结合实践详解 b+ 树存储引擎(innodb、boltdb、buntdb)](https://talkgo.org/t/topic/2154)          | 文小飞@腾讯 PCG                                                                                                                                                                                | [YouTube](https://youtu.be/9XtACKzFIRc) [Bilibili](https://www.bilibili.com/video/BV1vo4y117Mv/)                                                       |
|  114  | [2021-05-20 GoLand 2021.1 新特性介绍](https://talkgo.org/t/topic/2150)                                          | Florin Pățan&范圣佑@JetBrians                                                                                                                                                                  | [YouTube](https://youtu.be/5-3EKurCme0) [Bilibili](https://www.bilibili.com/video/BV1Vo4y117q6/)                                                       |
|  113  | [2021-04-29 性能优化究竟应该怎么做?](https://talkgo.org/t/topic/2127)                                          | 曹春晖                                                                                                                                                                                         | [YouTube](https://youtu.be/cntWx7-MPUg) [Bilibili](https://www.bilibili.com/video/BV1Z64y1m7uc/)                                                       |
|  112  | [2021-04-27 go-zero 分布式缓存最佳实践](https://talkgo.org/t/topic/1651)                                        | 万俊峰 kevin@晓黑板 CTO,好未来技术委员会资深专家                                                                                                                                              | [YouTube](https://youtu.be/csKogMn4v0Q) [Bilibili](https://www.bilibili.com/video/BV1Rv411L72P/)                                                       |
|  111  | [2021-02-25 KubeVela:标准化的云原生平台构建引擎](https://talkgo.org/t/topic/1651)                              | 孙健波 (花名:天元)@阿里云技术专家                                                                                                                                                             | [YouTube](https://youtu.be/BHyA5OYJ5ro) [Bilibili](https://www.bilibili.com/video/BV16U4y1W7Yd/)                                                       |
|  110  | [2021-02-19 What's new in Go 1.16](https://talkgo.org/t/topic/1750)                                             | 杨文@Go 夜读 SIG 成员                                                                                                                                                                          | [YouTube](https://youtu.be/GyyiQc2u64M) [Bilibili](https://www.bilibili.com/video/BV1fV411i7o1/)                                                       |
|  109  | [2021-01-28 Don’t be clever - understand memory ordering](https://talkgo.org/t/topic/1632)                      | 徐拯@ARM 中国,软件开发总监                                                                                                                                                                    | [YouTube](https://youtu.be/5DngpoH7WIY) [Bilibili](https://www.bilibili.com/video/BV1SU4y1s73u/)                                                       |
|  108  | [2021-01-21 Golang 反射的应用及源码分析](https://talkgo.org/t/topic/1606)                                       | kippa@早安科技                                                                                                                                                                                 | [YouTube](https://youtu.be/Q66UJijjrUQ) [Bilibili](https://www.bilibili.com/video/BV1My4y117gQ/)                                                       |
|  107  | [2020-11-07 Paxos 分布式共识算法介绍](https://talkgo.org/t/topic/1248)                                          | 黄威, 趣头条 Go 后端工程师                                                                                                                                                                     | [YouTube](https://youtu.be/bkWL4mtiVbs) [Bilibili](https://www.bilibili.com/video/BV1C5411L7qT)                                                        |
|  106  | [2020-11-05 嵌入式 Javascript 在 Golang 中的应用](https://talkgo.org/t/topic/1167)                              | Misko Lee(叶秋), Noise Labs 创始人                                                                                                                                                          | [YouTube](https://youtu.be/UECpCEB13-w) [Bilibili](https://www.bilibili.com/video/BV16T4y1F7Zz/)                                                       |
|  105  | [2020-10-03 go-zero 微服务框架解答和线上交流](https://talkgo.org/t/topic/1070)                                  | 万俊峰(Kevin)@晓黑板                                                                                                                                                                         | [YouTube](https://youtu.be/TXnS44qPn6A) [Bilibili](https://www.bilibili.com/video/BV1VZ4y1578X/)                                                       |
|  104  | [2020-09-13 通过 hashicorp/raft 库手把手调试 raft 算法](https://talkgo.org/t/topic/882)                         | 黄威@趣头条                                                                                                                                                                                    | [YouTube](https://youtu.be/EjGNtHrq4UQ) [Bilibili](https://www.bilibili.com/video/BV1tV411m7ir)                                                        |
|  103  | [2020-08-20 TiDB Operator 架构与实现](https://talkgo.org/t/topic/744/)                                          | 付业成@PingCAP                                                                                                                                                                                 | [YouTube](https://youtu.be/KWHuaRReCdw) [Bilibili](https://www.bilibili.com/video/BV1AV411S7b9/)                                                       |
|  102  | [2020-08-19 Go 官方标准编译器中实现的优化集锦](https://talkgo.org/t/topic/702)                                  | 老貘@go101 作者                                                                                                                                                                                | [YouTube](https://youtu.be/RCnG5eLH2KM) [Bilibili](https://www.bilibili.com/video/BV1YZ4y1K7w2)                                                        |
|  101  | [2020-08-16 晓黑板 go-zero 微服务框架的架构设计](https://talkgo.org/t/topic/729)                                | 万俊峰@晓黑板 CTO                                                                                                                                                                              | [YouTube](https://youtu.be/LNG4iX4oNjc) [Bilibili](https://www.bilibili.com/video/BV1rD4y127PD/)                                                       |
|  100  | [2020-08-13 如何高效的阅读 Go 代码?](https://talkgo.org/t/topic/623)                                           | Go 夜读 SIG 小组                                                                                                                                                                               | [YouTube](https://youtu.be/N4Kderp82uM) [Bilibili](https://www.bilibili.com/video/BV1XD4y1U7Pf/)                                                       |
|  99   | [2020-08-06 betterGo——用类似 C++的代码生成的方式实现 Go 泛型](https://talkgo.org/t/topic/619)                   | 张钰泽@西安工业大学                                                                                                                                                                            | [YouTube](https://youtu.be/9qpRQXctlrY) [Bilibili](https://www.bilibili.com/video/BV1oT4y1j7L2/)                                                       |
|  98   | [2020-08-01 Go 中的类型递归](https://talkgo.org/t/topic/613)                                                    | 卢俊杰@英语流利说                                                                                                                                                                              | [YouTube](https://youtu.be/TKcN43zBogI) [Bilibili](https://www.bilibili.com/video/BV1UZ4y1T7U1/)                                                       |
|  97   | [2020-07-23 我们可以从 mosn 和相关的项目中学习到什么](https://talkgo.org/t/topic/568)                           | 曹春晖@蚂蚁金服                                                                                                                                                                                | [YouTube](https://youtu.be/Ox58S98o6Cs) [Bilibili](https://www.bilibili.com/video/BV1nt4y1X7eT/)                                                       |
|  96   | [2020-07-11 百度大规模网络流量接入技术 & BFE 开源](https://talkgo.org/t/topic/554)                              | 章淼@百度                                                                                                                                                                                      | [YouTube](https://youtu.be/y6Xq6zPXya0) [Bilibili](https://www.bilibili.com/video/BV1Wp4y1S72o/)                                                       |
|  95   | [2020-07-09 Dubbo-go 的成长与蜕变之路](https://talkgo.org/t/topic/525)                                          | 邹毅贤                                                                                                                                                                                   | [YouTube](https://youtu.be/xJdH2CHgsvU) [Bilibili](https://www.bilibili.com/video/BV1BV411677w/)                                                       |
|  94   | [2020-07-02 斗鱼微服务框架 Jupiter 的诞生历程](https://talkgo.org/t/topic/537)                                  | 张明可@斗鱼                                                                                                                                                                                    | [YouTube](https://youtu.be/JmJXP0XqjIU) [Bilibili](https://www.bilibili.com/video/BV16z411e7Pb/)                                                       |
|  93   | [2020-06-25 Seata Go 分布式事务框架的介绍与实践](https://talkgo.org/t/topic/509)                                | 刘晓敏@成都世纪加华                                                                                                                                                                            | [YouTube](https://youtu.be/oHrOykVAakg) [Bilibili](https://www.bilibili.com/video/BV1oz411e72T/)                                                       |
|  92   | [2020-06-18 如何用 Go 实现一个压力测试工具](https://talkgo.org/t/topic/460)                                     | 疏辰辰(link1st)@小米                                                                                                                                                                           | [YouTube](https://youtu.be/vA7ego-Ph88) [Bilibili](https://www.bilibili.com/video/BV1Qt4y1X7T7)                                                        |
|  91   | [2020-06-17 Diagnosing Latency Issues Caused By Go’s Memory System](https://talkgo.org/t/topic/456)             | 李泽钧@PingCAP                                                                                                                                                                                 | [YouTube](https://youtu.be/as-ee-nwPQE) [Bilibili](https://www.bilibili.com/video/BV1fz411i7vV)                                                        |
|  90   | [2020-06-10 K8S 入门: 使用国内公有云快速部署容器云实验环境](https://talkgo.org/t/topic/415)                     | 陈逸文@PingCAP 实习生                                                                                                                                                                          | [YouTube](https://youtu.be/6VbfgkE5-aE) [Bilibili](https://www.bilibili.com/video/BV18Z4y1W7Jp/)                                                       |
|  89   | [2020-06-11 Sentinel Golang 面向云原生微服务的高可用流控防护组件](https://talkgo.org/t/topic/428)               | 娄宇庭,FreeWheel/AdServer,Software Engineer Alibaba Sentinel Committer                                                                                                                       | [YouTube](https://youtu.be/Fhck_105l8o) [Bilibili](https://www.bilibili.com/video/BV1Lz411i7jo/)                                                       |
|  88   | [2020-06-13 哆啦 A 梦—基于 Prometheus 的企业监控平台的设计与实现](https://talkgo.org/t/topic/438)               | 刘恒滔                                                                                                                                                                                         | [YouTube](https://youtu.be/5ACFuJ66S-0) [Bilibili](https://www.bilibili.com/video/BV1Kv411B7hZ/)                                                       |
|  87   | [2020-04-29 JetBrains GoLand 2020.1 新特性介绍](https://talkgo.org/t/topic/106)                                 | Florin Pățan&范圣佑@JetBrians                                                                                                                                                                  | [YouTube](https://youtu.be/QGEtbFtLMAc) [Bilibili](https://www.bilibili.com/video/BV14g4y1z7Nd/)                                                       |
|  86   | [2020-04-23 Go 中非类型安全指针相关的事实和使用规则](https://talkgo.org/t/topic/105)                            | 老貘                                                                                                                                                                                           | [YouTube](https://youtu.be/a_9oLmeFvwk) [Bilibili](https://www.bilibili.com/video/BV15V411d7WS)                                                        |
|  85   | [2020-04-16 斗鱼 Minerva 配置中心的设计与实现](https://talkgo.org/t/topic/104)                                  | 杜旻翔                                                                                                                                                                                         | [YouTube](https://youtu.be/i-Q3x1PBqD0) [Bilibili](https://www.bilibili.com/video/BV1D54y197nQ)                                                        |
|  84   | [2020-04-02 图解 Go 之内存对齐](https://talkgo.org/t/topic/103)                                                 | 苗蕾                                                                                                                                                                                           | [YouTube](https://youtu.be/8a2G2MXRUxw) [Bilibili](https://www.bilibili.com/video/BV1iZ4y1j7TT)                                                        |
|  83   | [2020-03-27 对 Go 程序进行可靠的性能测试](https://talkgo.org/t/topic/102)                                       | 欧长坤                                                                                                                                                                                         | [YouTube](https://youtu.be/RXM9cDzWZME) [Bilibili](https://www.bilibili.com/video/BV1ae411x7dM)                                                        |
|  82   | [2020-03-22 聊聊我们与 Go 夜读的故事以及效率效能学习分享](https://talkgo.org/t/topic/101)                       | Go 夜读 SIG 小组, 曹春晖, John, Darren 等                                                                                                                                                      | [YouTube](https://youtu.be/gk510UOJoBA) [Bilibili](https://www.bilibili.com/video/BV1bE411F7oK)                                                        |
|  81   | [2020-03-19 gorm 介绍与展望](https://talkgo.org/t/topic/100)                                                    | Jinzhu                                                                                                                                                                                         | [YouTube](https://youtu.be/NCZHe6zb2Sg) [Bilibili](https://www.bilibili.com/video/BV1pE411N7Sv/)                                                       |
|  80   | [2020-03-18 带你提前玩 Go 2 新特性:泛型](https://talkgo.org/t/topic/99)                                        | 欧长坤                                                                                                                                                                                         | [YouTube](https://youtu.be/E16Y6bI2S08) [Bilibili](https://www.bilibili.com/video/BV1k7411R7ya/)                                                       |
|  79   | [2020-03-12 Go-Micro 运行时工具集(三) by 舒先](https://talkgo.org/t/topic/98)                                 | 舒先                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=_ZLB4BPZaks&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1VE41157LP) |
|  78   | [2020-03-11 Go Scheduler 源码阅读](https://talkgo.org/t/topic/97)                                               | 饶全成                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=B-ozWjqnX24&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1SE411L7LU) |
|  77   | [2020-03-05 阅读 Go 源码带来的收益](https://talkgo.org/t/topic/96)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=cWSTLlE59rY&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1mE411W7pY) |
|  76   | [2020-02-20 Kubernetes Scheduler 设计与实现](https://talkgo.org/t/topic/95)                                     | Draven                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=1cQt2bXJtME&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1N7411w7M9) |
|  75   | [2020-02-07 2020 年 Go 的一些发展计划 (Go 1.14 && Go 1.15)](https://talkgo.org/t/topic/94)                      | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=hAshoKXMMu0&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1o7411h7d9) |
|  74   | [2020-01-02 time.Timer 源码分析 (Go 1.14)](https://talkgo.org/t/topic/93)                                       | 欧长坤                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=XJx0eTP-y9I&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1nJ411j7bU) |
|  73   | [2019-12-28 趣头条在长链接方面的实践 - qrpc](https://talkgo.org/t/topic/92)                                     | 徐志强                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=Ug4i4IHhGh4&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1VJ411a7K8) |
|  72   | [2019-12-19 Go-Micro 编写微服务实战 (二) by 舒先](https://talkgo.org/t/topic/91)                                | 舒先                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=7lvZhhgUB7o&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1fJ411t7gg) |
|  71   | [2019-12-12 go-ini 配置库评析](https://talkgo.org/t/topic/90)                                                   | 无闻                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=783MGw53gfw&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1gJ411C7WF) |
|  70   | [2019-12-05 Go 中不常注意的各种细节集锦](https://talkgo.org/t/topic/89)                                         | 老貘                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=kcwHwN8nTP8&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1HJ411i7oG) |
|  69   | [2019-11-28 DevOps 实践之路 - 基于 Go 语言周边生态打造的行业技术中台](https://talkgo.org/t/topic/88)            | 杨晖@腾讯教育                                                                                                                                                                                  | [YouTube](https://www.youtube.com/watch?v=wS897lDB_Lk&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1mJ411D7nr) |
|  68   | [2019-11-21 网络知识十全大补丸](https://talkgo.org/t/topic/87)                                                  | 刘楠@字节跳动                                                                                                                                                                                  | [YouTube](https://www.youtube.com/watch?v=30wCahZEjNg&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1vJ41127p2) |
|  67   | [2019-11-14 Go database/sql 数据库连接池分析](https://talkgo.org/t/topic/86)                                    | 邹文通                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=JKJ8ehtiqUM&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV17J411D7yb) |
|  66   | [2019-11-07 #Paper-Reading CSP 理解顺序进程间通信](https://talkgo.org/t/topic/85)                               | 欧长坤                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=Z8ZpWVuEx8c&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1wE411q7G9) |
|  65   | [2019-10-31 Go 网络编程:Go 原生同步网络模型解析 vs Multi-Reactors 异步网络模型](https://talkgo.org/t/topic/84) | 潘建锋                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=4QurJJHuxaQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV13E411B721) |
|  64   | [2019-10-24 深入浅出 Golang Runtime](https://talkgo.org/t/topic/83)                                             | 郝以奋                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=oFJL8S1dwsw&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1oE411y7qG) |
|  63   | [2019-10-17 Go 编码风格阅读与讨论](https://talkgo.org/t/topic/82)                                               | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=91YbbwlKZ2k&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1NE411y7iP) |
|  62   | [2019-10-10 Go-Micro 微服务框架(一)](https://talkgo.org/t/topic/80)                                           | 舒先                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=ucTwnDB1m2U&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV18E411o7c5) |
|  61   | [2019-09-26 Go Modules、Go Module Proxy 和 goproxy.cn](https://talkgo.org/t/topic/81)                           | 盛傲飞                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=H3LVVwZ9zNY&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1zJ411T7s9) |
|  60   | [2019-09-19 IPFS 星际文件系统](https://talkgo.org/t/topic/79)                                                   | 向程@华中科技大学研究生                                                                                                                                                                        | [YouTube](https://www.youtube.com/watch?v=7xEWKaTE2TI&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1xJ41137zp) |
|  59   | [2019-09-12 #paper reading Real-world Go Concurrency Bugs](https://talkgo.org/t/topic/78)                       | 欧长坤                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=WZUii-Czaps&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1SJ411w7Ue) |
|  58   | [2019-09-05 What's new in Go 1.13?](https://talkgo.org/t/topic/77)                                             | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=jVUy47OrpRk&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1h4411y7wV) |
|  57   | [2019-08-29 sync/semaphore 源码浅析](https://talkgo.org/t/topic/76)                                             | Felix                                                                                                                                                                                          | [YouTube](https://www.youtube.com/watch?v=VEtdLBFY_y4&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1S4411q7mK) |
|  56   | [2019-08-22 channel & select 源码分析](https://talkgo.org/t/topic/75)                                           | 欧长坤                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=d7fFCGGn0Wc&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1g4411R7p5) |
|  55   | [2019-08-15 Go&WebAssembly 简介](https://talkgo.org/t/topic/74)                                                 | 柴树杉@蚂蚁金服                                                                                                                                                                                | [YouTube](https://www.youtube.com/watch?v=O_FJgYKOBYQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1r4411U7GS) |
|  54   | [2019-08-14 TiDB SQL 兼容性测试工具简介](https://talkgo.org/t/topic/73)                                         | 谢腾进、赵一霖@PingCAP                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=Hmu3F1Vafqc&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1N4411U7Xx) |
|  53   | [2019-08-01 build in func delete from map](https://talkgo.org/t/topic/72)                                       | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=sn810EcpOVs&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pt411F7Sj) |
|  52   | [2019-07-25 httprouter 简介](https://talkgo.org/t/topic/71)                                                     | 曹春晖                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=BLYX6SKxFJA&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Ut411j7eb) |
|  51   | [2019-07-18 sync/errgroup 源码阅读](https://talkgo.org/t/topic/70)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=CQOZtzmgLvw&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV18t41137KD) |
|  50   | [2019-06-27 GoLand Tips & Tricks](https://talkgo.org/t/topic/69)                                                | Florin Pățan&范圣佑@JetBrians                                                                                                                                                                  | [YouTube](https://www.youtube.com/watch?v=iCGsPN4qgdM&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1qx411d7ee) |
|  49   | [2019-06-26 TiDB 源码阅读之 Transaction](https://talkgo.org/t/topic/68)                                         | zimulala@PingCAP                                                                                                                                                                               | [YouTube](https://www.youtube.com/watch?v=A46VE3aUTKo&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1ox411R7EA) |
|  48   | [2019-06-19 TiDB 源码阅读之 Compiler](https://talkgo.org/t/topic/67)                                            | wangcong@PingCAP                                                                                                                                                                               | [YouTube](https://www.youtube.com/watch?v=4mgx8bq_fcQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1m4411g7Yy) |
|  47   | [2019-06-12 TiDB 源码阅读之 Executor](https://talkgo.org/t/topic/66)                                            | 陈霜@PingCAP                                                                                                                                                                                   | [YouTube](https://www.youtube.com/watch?v=Rcrm4w7sqbM&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV134411P7CU) |
|  46   | [2019-06-05 TiDB 源码阅读之概览](https://talkgo.org/t/topic/65)                                                 | 龙恒@PingCAP                                                                                                                                                                                   | [YouTube](https://www.youtube.com/watch?v=mK6BOquvQhE&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1i4411M7wj) |
|  45   | [2019-05-30 goim 架构设计与源码分析](https://talkgo.org/t/topic/64)                                             | tsingson                                                                                                                                                                                       | [YouTube](https://www.youtube.com/watch?v=u7EDJhKiaO8&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV164411H7D2) |
|  44   | [2019-05-29 Go map 源码阅读分析](https://talkgo.org/t/topic/63)                                                 | 饶全成                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=P2v3kvztWU0&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Q4411W7MR) |
|  43   | [2019-05-23 gomonkey 框架设计与应用实践](https://talkgo.org/t/topic/62)                                         | 张晓龙                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=OpuX47E7B2w&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1a4411L7g4) |
|  42   | [2019-05-16 An Introduction to Failpoint Design](https://talkgo.org/t/topic/61)                                 | 龙恒@PingCAP                                                                                                                                                                                   | [YouTube](https://www.youtube.com/watch?v=ke7zzny9dxU&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1R4411J7bj) |
|  41   | [2019-05-12 golint 及 golangci-lint 的介绍和使用](https://talkgo.org/t/topic/60)                                | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=z42y4tpRmbw&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV154411a79S) |
|  40   | [2019-04-27 atomic.Value 的使用和源码分析](https://talkgo.org/t/topic/59)                                       | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=pyics4WyUmA&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1n4411b75w) |
|  39   | [2019-04-18 init function 使用分析](https://talkgo.org/t/topic/58)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=62mci2mPQDU&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Fb411L7kL) |
|  38   | [2019-04-13 kubernetes scheduler 源码阅读](https://talkgo.org/t/topic/57)                                       | John                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=T83rJuIs7PE&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1gb411j7Z3) |
|  37   | [2019-04-01 从 serverless 的一个设计说起](https://talkgo.org/t/topic/56)                                        | 冉小龙                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=wfTQlM8eics&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1nb411p7PW) |
|  36   | [2019-03-28 k8s context 实践源码阅读](https://talkgo.org/t/topic/55)                                            | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=JLuBPEeS9G8&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1vb411x7ic) |
|  35   | [2019-03-21 context 源码阅读](https://talkgo.org/t/topic/54)                                                    | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=LhEiCTkF2S8&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Ub411j7ia) |
|  34   | [2019-03-16 plan9 汇编入门,带你打通应用和底层 by Xargin](https://talkgo.org/t/topic/53)                        | 曹春晖                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=dPdXxex1v_4&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Xb411J7Yk) |
|  33   | [2019-03-07 Go defer 和逃逸分析](https://talkgo.org/t/topic/52)                                                 | 饶全成                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=-FtBBx44E3g&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pb411v7m7) |
|  32   | [2019-03-03 etcd raft 源码阅读](https://talkgo.org/t/topic/51)                                                  | 缪昌新                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=sL02PsR20gE&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Eb411B7RM) |
|  31   | [2019-02-23 flag 包源码阅读](https://talkgo.org/t/topic/50)                                                     | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=z-9WEuUWqu4&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pb411B7ov) |
|  30   | [2019-02-23 go mod 源码阅读 Part 4](https://talkgo.org/t/topic/49)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=PPZ2vKt9ENs&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1tE411Z7bJ) |
|  29   | [2019-01-23 Go opentracing jaeger 集成及源码分析](https://talkgo.org/t/topic/48)                                | jukylin                                                                                                                                                                                        | [YouTube](https://www.youtube.com/watch?v=ub7jtN13KHA&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1ut411b7Qu) |
|  28   | [2019-01-17 go mod 源码阅读 Part 3](https://talkgo.org/t/topic/47)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=tD7Aj6tKhGc&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1bt41187LF) |
|  27   | [2019-01-10 go mod 源码阅读 Part 2](https://talkgo.org/t/topic/46)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=Isd-FOmM9C8&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1kt411p7X4) |
|  26   | [2019-01-03 手把手教你基于 Github+Netlify 构建自动化持续集成的技术团队博客](https://talkgo.org/t/topic/45)      | John                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=we6qrILQRjY&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Zt411s7JM) |
|  25   | [2018-12-27 TSDB 引擎介绍,对比及存储细节](https://talkgo.org/t/topic/44)                                       | yuyang                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=W-8PiciSWRM&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1ht411873N) |
|  24   | [2018-12-23 go mod 源码阅读 Part 1](https://talkgo.org/t/topic/43)                                              | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=_Kdud_EN-eQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1ht41187T9) |
|  23   | [2018-12-13 Drone 简单介绍和部分源码分析](https://talkgo.org/t/topic/42)                                        | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=Vg5EvcStD4k&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z7pJ) |
|  22   | [2018-12-06 Go 开发工具讨论](https://talkgo.org/t/topic/41)                                                     | 杨文/John                                                                                                                                                                                      | [YouTube](https://www.youtube.com/watch?v=XjAQRnJj6zI&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z7nd) |
|  21   | [2018-11-28 errors 处理及 zap 源码分析](https://talkgo.org/t/topic/40)                                          | 叶飞/阙坦                                                                                                                                                                                     | [YouTube](https://www.youtube.com/watch?v=ImJim15N_Wc&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z7t6) |
|  20   | [2018-11-15 go test 及测试覆盖率](https://talkgo.org/t/topic/39)                                                | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=qkFFIIaTgHM&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z74v) |
|  19   | [2018-11-08 如何开发一个简单高性能的 http router 及 gorouter 源码分析](https://talkgo.org/t/topic/38)           | 徐佳军                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=3BoStxKECL0&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z7W1) |
|  18   | [2018-09-27 去中心化加密通信框架 CovenantSQL/DH-RPC 的设计](https://talkgo.org/t/topic/37)                      | 王鹏程                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=bAfiKsLbDeE&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z7aJ) |
|  17   | [2018-09-20 grpc 开发及 grpcp 的源码分析](https://talkgo.org/t/topic/36)                                        | 林益帆                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=sMBgYYEgm3c&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1ht41187Wh) |
|  16   | [2018-09-06 OpenFaas 介绍及源码分析](https://talkgo.org/t/topic/35)                                             | 朱振峰@字节跳动                                                                                                                                                                                | [YouTube](https://www.youtube.com/watch?v=bZtgrAVR9HQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV15b411z783) |
|  15   | [2018-08-23 多路复用资源池组件剖析](https://talkgo.org/t/topic/34)                                              | 李亚川                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=CDfrRzgmR4E&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1Vb411z7fm) |
|  14   | [2018-08-17 sync.Pool 源码分析及适用场景](https://talkgo.org/t/topic/33)                                        | 杨文                                                                                                                                                                                           | [YouTube](https://www.youtube.com/watch?v=jaepwn2PWPk&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1tE411Z7ZR) |
|  13   | [2018-08-10 Kubernetes 入门指南](https://talkgo.org/t/topic/32)                                                 | 李森森                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=DJgYlmGCmDA&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1ht41187nc) |
|  12   | [2018-08-01 Go 中 Goroutine 的调度](https://talkgo.org/t/topic/31)                                              | 郑宝杨                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=98pIzaOeD2k&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pb411v7nu) |
|  11   | [2018-07-26 Go 代码质量持续检测实践](https://talkgo.org/t/topic/30)                                             | 吴雨豪                                                                                                                                                                                         | [YouTube](https://www.youtube.com/watch?v=d95PZDAabqQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pb411v77K) |
|  10   | [2018-06-28 http 包源码阅读 part3 2018-06-28 线下活动](https://talkgo.org/t/topic/29)                           |                                                                                                                                                                                                | [YouTube](https://www.youtube.com/watch?v=xodlVBWxTYM&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pb411v7Aa) |
|   9   | [2018-06-14 Go 标准包 net 源码阅读(三)线下活动(未录制视频)](https://talkgo.org/t/topic/28)                  |                                                                                                                                                                                                |                                                                                                                                                        |
|   8   | [2018-05-31 线下活动 - Go 标准包 net/http 源码阅读(二)](https://talkgo.org/t/topic/27)                        |                                                                                                                                                                                                | [YouTube](https://www.youtube.com/watch?v=U84dn76gixQ&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV1pb411v7K6) |
|   7   | [2018-05-24 线下活动 - Go 标准包 net/http 源码阅读(一)](https://talkgo.org/t/topic/26)                        |                                                                                                                                                                                                | [YouTube](https://www.youtube.com/watch?v=qnrTDH8oiXY&list=PLe5svQwVF1L5bNxB0smO8gNfAZQYWdIpI) [Bilibili](https://www.bilibili.com/video/BV19E411b7iZ) |
|   6   | [2018-05-17 线下活动](https://talkgo.org/t/topic/25)                                                            |                                                                                                                                                                                                |
|   5   | [2018-05-10 线下活动 - Go 标准包 strings 源码阅读(三)](https://talkgo.org/t/topic/24)                         |                                                                                                                                                                                                |
|   4   | [2018-04-25 线下活动 - Go 标准包 strings 源码阅读(二)](https://talkgo.org/t/topic/23)                         |                                                                                                                                                                                                |
|   3   | [2018-04-18 线下活动 - Go 标准包 strings 源码阅读(一)](https://talkgo.org/t/topic/22)                         |                                                                                                                                                                                                |
|   2   | [2018-04-11 线下活动 - 微服务框架(teleport, tp-micro, ants)](https://talkgo.org/t/topic/21)                   |                                                                                                                                                                                                |
|   1   | [2018-03-21 线下活动 - teleport, goutil](https://talkgo.org/t/topic/20)                                         |                                                                                                                                                                                                |


## 如何发起分享提案?

你是否经常困扰于某些 Go 话题没有人分享或者很少人关注?自己很想深入研究,但是却是形单影只,经常半途而废呢?

机会来了!!!参考[如何发起分享提案](https://github.com/talkgo/night/blob/master/SHARE_REQUEST_PROPOSAL.md)

## 如何参与贡献?

想要参与贡献?阅读 [如何参与贡献](https://github.com/talkgo/night/blob/master/CONTRIBUTING.md) 查看指南。

## Stargazers over time

[talklgo/night Star History and Stats](https://seladb.github.io/StarTrack-js/#/preload?r=talkgo,night)

## Contributors

### Code Contributors

This project exists thanks to all the people who contribute.
<a href="https://github.com/talkgo/night/graphs/contributors"><img src="https://opencollective.com/talkgo/contributors.svg?width=890&button=false" /></a>

### Financial Contributors

Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/talkgo/contribute)]

#### Individuals

<a href="https://opencollective.com/talkgo"><img src="https://opencollective.com/talkgo/individuals.svg?width=890"></a>

#### Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/talkgo/contribute)]

<a href="https://opencollective.com/talkgo/organization/0/website"><img src="https://opencollective.com/talkgo/organization/0/avatar.svg"></a>

<p>This project is supported by:</p>
<p>
  <a href="https://www.digitalocean.com/?refcode=c18e66e7d0e9&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="https://web-platforms.sfo2.cdn.digitaloceanspaces.com/WWW/Badge%202.svg" alt="DigitalOcean Referral Badge" /></a>
</p>


## Contributors

我非常重视每一个对这个项目的贡献者,我会将贡献者列表更新到这里,目前只有提交 Pull Request 的小伙伴,但是贡献不仅仅如此,还可以包括提交 Issue 以及在社群中有所贡献的人。

贡献者自己可以提 PR ,方法如下:

- 安装 `npm install -g --save-dev all-contributors-cli`
- `sh gen_contributors.sh`

贡献类型有多种,比如:"code", "ideas","review","talk","tutorial",你可以在 `.all-contributorsrc` 中修改。

Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center"><a href="https://github.com/yangwenmai"><img src="https://avatars3.githubusercontent.com/u/1710912?v=4?s=100" width="100px;" alt="maiyang"/><br /><sub><b>maiyang</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=yangwenmai" title="Code">💻</a> <a href="#ideas-yangwenmai" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/talkgo/night/pulls?q=is%3Apr+reviewed-by%3Ayangwenmai" title="Reviewed Pull Requests">👀</a> <a href="#talk-yangwenmai" title="Talks">📢</a> <a href="#tutorial-yangwenmai" title="Tutorials">✅</a></td>
      <td align="center"><a href="https://github.com/mougeCM"><img src="https://avatars1.githubusercontent.com/u/16773339?v=4?s=100" width="100px;" alt="Simple Min"/><br /><sub><b>Simple Min</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=mougeCM" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/yuhao5"><img src="https://avatars3.githubusercontent.com/u/35653599?v=4?s=100" width="100px;" alt="kenny"/><br /><sub><b>kenny</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=yuhao5" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/charnlsxy"><img src="https://avatars2.githubusercontent.com/u/13843868?v=4?s=100" width="100px;" alt="charnlsxy"/><br /><sub><b>charnlsxy</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=charnlsxy" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/AceDarkknight"><img src="https://avatars3.githubusercontent.com/u/11901298?v=4?s=100" width="100px;" alt="AceDarkknight"/><br /><sub><b>AceDarkknight</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=AceDarkknight" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/gnuos"><img src="https://avatars2.githubusercontent.com/u/3014297?v=4?s=100" width="100px;" alt="Data"/><br /><sub><b>Data</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=gnuos" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/KISSMonX"><img src="https://avatars0.githubusercontent.com/u/2876745?v=4?s=100" width="100px;" alt="侯名"/><br /><sub><b>侯名</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=KISSMonX" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/dumliu01"><img src="https://avatars0.githubusercontent.com/u/12060175?v=4?s=100" width="100px;" alt="dumliu01"/><br /><sub><b>dumliu01</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=dumliu01" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/hlily2005"><img src="https://avatars0.githubusercontent.com/u/1411282?v=4?s=100" width="100px;" alt="hlily2005"/><br /><sub><b>hlily2005</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=hlily2005" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/henrylee2cn"><img src="https://avatars3.githubusercontent.com/u/10174178?v=4?s=100" width="100px;" alt="henrylee2cn"/><br /><sub><b>henrylee2cn</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=henrylee2cn" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/shaqsnake"><img src="https://avatars0.githubusercontent.com/u/1336914?v=4?s=100" width="100px;" alt="shaqsnake"/><br /><sub><b>shaqsnake</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=shaqsnake" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/TBWISK"><img src="https://avatars0.githubusercontent.com/u/5728787?v=4?s=100" width="100px;" alt="tbwisk"/><br /><sub><b>tbwisk</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=TBWISK" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/toontong"><img src="https://avatars3.githubusercontent.com/u/416141?v=4?s=100" width="100px;" alt="Huang ChuanTong"/><br /><sub><b>Huang ChuanTong</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=toontong" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/zhongxuan123"><img src="https://avatars3.githubusercontent.com/u/10513552?v=4?s=100" width="100px;" alt="The notes of SQL optimize "/><br /><sub><b>The notes of SQL optimize </b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=zhongxuan123" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/zhouxinxin19920802"><img src="https://avatars2.githubusercontent.com/u/29008269?v=4?s=100" width="100px;" alt="zhouxinxin19920802"/><br /><sub><b>zhouxinxin19920802</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=zhouxinxin19920802" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/macaria"><img src="https://avatars2.githubusercontent.com/u/20811449?v=4?s=100" width="100px;" alt="macaria"/><br /><sub><b>macaria</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=macaria" title="Code">💻</a></td>
      <td align="center"><a href="http://github.com/DennisMao"><img src="https://avatars3.githubusercontent.com/u/15226239?v=4?s=100" width="100px;" alt="Dennis"/><br /><sub><b>Dennis</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=DennisMao" title="Code">💻</a></td>
      <td align="center"><a href="http://blog.csdn.net/orangleliu"><img src="https://avatars1.githubusercontent.com/u/2696746?v=4?s=100" width="100px;" alt="orangleliu"/><br /><sub><b>orangleliu</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=orangle" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/HarbinZhang"><img src="https://avatars1.githubusercontent.com/u/21693162?v=4?s=100" width="100px;" alt="HarbinZhang"/><br /><sub><b>HarbinZhang</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=HarbinZhang" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/SwanSpouse"><img src="https://avatars1.githubusercontent.com/u/7344921?v=4?s=100" width="100px;" alt="LiMingji"/><br /><sub><b>LiMingji</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=SwanSpouse" title="Code">💻</a> <a href="https://github.com/talkgo/night/commits?author=SwanSpouse" title="Documentation">📖</a></td>
      <td align="center"><a href="https://mickey0524.github.io/"><img src="https://avatars0.githubusercontent.com/u/22164927?v=4?s=100" width="100px;" alt="wintersnow"/><br /><sub><b>wintersnow</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=mickey0524" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/zhuzhenfeng-finogeeks"><img src="https://avatars2.githubusercontent.com/u/44076738?v=4?s=100" width="100px;" alt="zhuzhenfeng"/><br /><sub><b>zhuzhenfeng</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=zhuzhenfeng-finogeeks" title="Code">💻</a></td>
      <td align="center"><a href="https://xujiajun.cn"><img src="https://avatars2.githubusercontent.com/u/6065007?v=4?s=100" width="100px;" alt="徐佳军"/><br /><sub><b>徐佳军</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=xujiajun" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/NichoZhang"><img src="https://avatars0.githubusercontent.com/u/6884499?v=4?s=100" width="100px;" alt="nicho"/><br /><sub><b>nicho</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=NichoZhang" title="Code">💻</a></td>
      <td align="center"><a href="https://www.btxiaowei.net"><img src="https://avatars1.githubusercontent.com/u/17244565?v=4?s=100" width="100px;" alt="Weifeng Wang"/><br /><sub><b>Weifeng Wang</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=qclaogui" title="Code">💻</a></td>
      <td align="center"><a href="https://hiboot.hidevops.io"><img src="https://avatars3.githubusercontent.com/u/6748475?v=4?s=100" width="100px;" alt="John Deng"/><br /><sub><b>John Deng</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=john-deng" title="Code">💻</a></td>
      <td align="center"><a href="http://jeasonstudio.github.io"><img src="https://avatars0.githubusercontent.com/u/17971291?v=4?s=100" width="100px;" alt="赵吉彤"/><br /><sub><b>赵吉彤</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=jeasonstudio" title="Code">💻</a></td>
      <td align="center"><a href="http://zouying.is"><img src="https://avatars0.githubusercontent.com/u/3946563?v=4?s=100" width="100px;" alt="YING ZOU"/><br /><sub><b>YING ZOU</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=xpzouying" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/zsy619"><img src="https://avatars3.githubusercontent.com/u/6278792?v=4?s=100" width="100px;" alt="zsy619"/><br /><sub><b>zsy619</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=zsy619" title="Code">💻</a></td>
      <td align="center"><a href="https://blog.yangfan21.cn/"><img src="https://avatars2.githubusercontent.com/u/11313960?v=4?s=100" width="100px;" alt="杨帆"/><br /><sub><b>杨帆</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=yangfan21" title="Code">💻</a></td>
      <td align="center"><a href="https://blog.sodroid.com"><img src="https://avatars3.githubusercontent.com/u/9268902?v=4?s=100" width="100px;" alt="HundredLee"/><br /><sub><b>HundredLee</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=hundredlee" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/mlboy"><img src="https://avatars3.githubusercontent.com/u/1733903?v=4?s=100" width="100px;" alt="mlboy"/><br /><sub><b>mlboy</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=mlboy" title="Code">💻</a></td>
      <td align="center"><a href="https://liangyuanpeng.netlify.com/"><img src="https://avatars1.githubusercontent.com/u/28711504?v=4?s=100" width="100px;" alt="fish"/><br /><sub><b>fish</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=liangyuanpeng" title="Code">💻</a></td>
      <td align="center"><a href="https://laji.cx"><img src="https://avatars2.githubusercontent.com/u/20315934?v=4?s=100" width="100px;" alt="时小光"/><br /><sub><b>时小光</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=abcdsxg" title="Code">💻</a></td>
      <td align="center"><a href="https://ziyi-yan.github.io"><img src="https://avatars1.githubusercontent.com/u/44582639?v=4?s=100" width="100px;" alt="Ziyi Yan"/><br /><sub><b>Ziyi Yan</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=ziyi-yan" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/lpflpf"><img src="https://avatars2.githubusercontent.com/u/11867562?s=460&v=4?s=100" width="100px;" alt="李朋飞"/><br /><sub><b>李朋飞</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=lpflpf" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/EDDYCJY"><img src="https://avatars0.githubusercontent.com/u/13746731?v=4?s=100" width="100px;" alt="煎鱼"/><br /><sub><b>煎鱼</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=EDDYCJY" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/feirie"><img src="https://avatars2.githubusercontent.com/u/3349949?v=4?s=100" width="100px;" alt="Wang Fei"/><br /><sub><b>Wang Fei</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=feirie" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/jukylin"><img src="https://avatars0.githubusercontent.com/u/8568271?v=4?s=100" width="100px;" alt="742161455"/><br /><sub><b>742161455</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=jukylin" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/feifeiiiiiiiiiii"><img src="https://avatars1.githubusercontent.com/u/3310967?s=460&v=4?s=100" width="100px;" alt="feifeiiiiiiiiiii"/><br /><sub><b>feifeiiiiiiiiiii</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=feifeiiiiiiiiiii" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/cuishuang"><img src="https://avatars0.githubusercontent.com/u/15921519?v=4?s=100" width="100px;" alt="崔爽"/><br /><sub><b>崔爽</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=cuishuang" title="Code">💻</a></td>
      <td align="center"><a href="http://www.techclone.cn"><img src="https://avatars1.githubusercontent.com/u/16793420?v=4?s=100" width="100px;" alt="jasonxie"/><br /><sub><b>jasonxie</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=JasonRD" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="http://cuihao.fun"><img src="https://avatars0.githubusercontent.com/u/9942270?v=4?s=100" width="100px;" alt="haoc7"/><br /><sub><b>haoc7</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=itcuihao" title="Code">💻</a></td>
      <td align="center"><a href="https://blog.wangriyu.wang/"><img src="https://avatars3.githubusercontent.com/u/24445731?s=400&v=4?s=100" width="100px;" alt="鱼乐"/><br /><sub><b>鱼乐</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=wangriyu" title="Code">💻</a></td>
      <td align="center"><a href="https://littlesqx.github.io/"><img src="https://avatars2.githubusercontent.com/u/16516151?s=400&v=4?s=100" width="100px;" alt="Littlesqx"/><br /><sub><b>Littlesqx</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=Littlesqx" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/mchangxin"><img src="https://avatars1.githubusercontent.com/u/31753706?s=400&v=4?s=100" width="100px;" alt="mchangxin"/><br /><sub><b>mchangxin</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=mchangxin" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/Hokkaitao"><img src="https://avatars0.githubusercontent.com/u/32830059?s=400&v=4?s=100" width="100px;" alt="Hokkaitao"/><br /><sub><b>Hokkaitao</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=Hokkaitao" title="Code">💻</a></td>
      <td align="center"><a href="http://maxlivinci.com/"><img src="https://avatars3.githubusercontent.com/u/11765228?v=4?s=100" width="100px;" alt="Max Li"/><br /><sub><b>Max Li</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=LIYINGZHEN" title="Code">💻</a></td>
      <td align="center"><a href="https://www.jianshu.com/u/5eea945d14f6"><img src="https://avatars2.githubusercontent.com/u/41495709?s=460&v=4?s=100" width="100px;" alt="GameOver "/><br /><sub><b>GameOver </b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=wty4427300" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="http://davygeek.cnblogs.com/"><img src="https://avatars2.githubusercontent.com/u/12783140?s=460&v=4?s=100" width="100px;" alt="davygeek"/><br /><sub><b>davygeek</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=davygeek" title="Code">💻</a></td>
      <td align="center"><a href="https://changkun.de/"><img src="https://avatars0.githubusercontent.com/u/5498964?s=460&v=4?s=100" width="100px;" alt="Ou Changkun"/><br /><sub><b>Ou Changkun</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=changkun" title="Code">💻</a></td>
      <td align="center"><a href="http://www.cnblogs.com/linkstar/"><img src="https://avatars2.githubusercontent.com/u/19712692?s=460&v=4?s=100" width="100px;" alt="LinkinStar"/><br /><sub><b>LinkinStar</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=LinkinStars" title="Code">💻</a></td>
      <td align="center"><a href="http://azd1997.github.io/"><img src="https://avatars3.githubusercontent.com/u/33643657?s=460&v=4?s=100" width="100px;" alt="Eiger"/><br /><sub><b>Eiger</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=azd1997" title="Code">💻</a></td>
      <td align="center"><a href="http://dayuoba.github.io/"><img src="https://avatars1.githubusercontent.com/u/9914235?s=460&v=4?s=100" width="100px;" alt="dayu"/><br /><sub><b>dayu</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=dayuoba" title="Code">💻</a></td>
      <td align="center"><a href="https://blog.csdn.net/scylhy"><img src="https://avatars1.githubusercontent.com/u/12492939?s=460&v=4?s=100" width="100px;" alt="scylhy"/><br /><sub><b>scylhy</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=scylhy" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/sober-wang"><img src="https://avatars0.githubusercontent.com/u/35804630?s=460&v=4?s=100" width="100px;" alt="尚墨"/><br /><sub><b>尚墨</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=sober-wang" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/xhochipe"><img src="https://avatars0.githubusercontent.com/u/9391575?s=460&v=4?s=100" width="100px;" alt="xhochipe"/><br /><sub><b>xhochipe</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=xhochipe" title="Code">💻</a></td>
      <td align="center"><a href="http://taohuawu.club"><img src="https://avatars2.githubusercontent.com/u/7496278?v=4?s=100" width="100px;" alt="Andy Pan"/><br /><sub><b>Andy Pan</b></sub></a><br /><a href="#talk-panjf2000" title="Talks">📢</a></td>
      <td align="center"><a href="http://patreon.com/jinzhu"><img src="https://avatars3.githubusercontent.com/u/6843?v=4?s=100" width="100px;" alt="Jinzhu"/><br /><sub><b>Jinzhu</b></sub></a><br /><a href="#talk-jinzhu" title="Talks">📢</a></td>
      <td align="center"><a href="https://unknwon.io"><img src="https://avatars3.githubusercontent.com/u/2946214?v=4?s=100" width="100px;" alt="Unknwon"/><br /><sub><b>Unknwon</b></sub></a><br /><a href="#talk-unknwon" title="Talks">📢</a></td>
      <td align="center"><a href="https://github.com/printfcoder"><img src="https://avatars3.githubusercontent.com/u/20906540?v=4?s=100" width="100px;" alt="Shu xian"/><br /><sub><b>Shu xian</b></sub></a><br /><a href="#talk-printfcoder" title="Talks">📢</a></td>
      <td align="center"><a href="https://github.com/nandyliu"><img src="https://avatars3.githubusercontent.com/u/16110707?v=4?s=100" width="100px;" alt="nandyliu"/><br /><sub><b>nandyliu</b></sub></a><br /><a href="#talk-nandyliu" title="Talks">📢</a></td>
      <td align="center"><a href="http://redhair.cn"><img src="https://avatars0.githubusercontent.com/u/5027885?v=4?s=100" width="100px;" alt="shanks"/><br /><sub><b>shanks</b></sub></a><br /><a href="#talk-shanksyang" title="Talks">📢</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/yaxinlx"><img src="https://avatars1.githubusercontent.com/u/15266642?v=4?s=100" width="100px;" alt="yaxinlx"/><br /><sub><b>yaxinlx</b></sub></a><br /><a href="#talk-yaxinlx" title="Talks">📢</a></td>
      <td align="center"><a href="http://about.me/appleboy"><img src="https://avatars0.githubusercontent.com/u/21979?v=4?s=100" width="100px;" alt="Bo-Yi Wu"/><br /><sub><b>Bo-Yi Wu</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=appleboy" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/KippaZou"><img src="https://avatars2.githubusercontent.com/u/31032511?v=4?s=100" width="100px;" alt="Kippa"/><br /><sub><b>Kippa</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=KippaZou" title="Code">💻</a> <a href="#talk-KippaZou" title="Talks">📢</a></td>
      <td align="center"><a href="https://github.com/15ho"><img src="https://avatars2.githubusercontent.com/u/20267050?v=4?s=100" width="100px;" alt="15ho"/><br /><sub><b>15ho</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=15ho" title="Code">💻</a></td>
      <td align="center"><a href="https://draveness.me/"><img src="https://avatars0.githubusercontent.com/u/6493255?v=4?s=100" width="100px;" alt="Draven"/><br /><sub><b>Draven</b></sub></a><br /><a href="#talk-draveness" title="Talks">📢</a></td>
      <td align="center"><a href="https://github.com/h3l"><img src="https://avatars0.githubusercontent.com/u/1664952?v=4?s=100" width="100px;" alt="h3l"/><br /><sub><b>h3l</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=h3l" title="Code">💻</a></td>
      <td align="center"><a href="https://twitter.com/seladb"><img src="https://avatars3.githubusercontent.com/u/9059541?v=4?s=100" width="100px;" alt="seladb"/><br /><sub><b>seladb</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=seladb" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/haojunyu"><img src="https://avatars1.githubusercontent.com/u/5105483?v=4?s=100" width="100px;" alt="郝俊禹"/><br /><sub><b>郝俊禹</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=haojunyu" title="Documentation">📖</a></td>
      <td align="center"><a href="https://github.com/luojiego"><img src="https://avatars2.githubusercontent.com/u/3175699?v=4?s=100" width="100px;" alt="Roger"/><br /><sub><b>Roger</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=luojiego" title="Documentation">📖</a></td>
      <td align="center"><a href="https://yuque.com/clip"><img src="https://avatars3.githubusercontent.com/u/8187479?v=4?s=100" width="100px;" alt="clip"/><br /><sub><b>clip</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=binderclip" title="Documentation">📖</a></td>
      <td align="center"><a href="https://github.com/shengyou"><img src="https://avatars2.githubusercontent.com/u/1264736?v=4?s=100" width="100px;" alt="Shengyou Fan"/><br /><sub><b>Shengyou Fan</b></sub></a><br /><a href="#talk-shengyou" title="Talks">📢</a></td>
      <td align="center"><a href="http://florinpatan.ro"><img src="https://avatars2.githubusercontent.com/u/607868?v=4?s=100" width="100px;" alt="Florin Pățan"/><br /><sub><b>Florin Pățan</b></sub></a><br /><a href="#talk-dlsniper" title="Talks">📢</a></td>
      <td align="center"><a href="http://www.xiaoheiban.cn"><img src="https://avatars1.githubusercontent.com/u/1918356?v=4?s=100" width="100px;" alt="Kevin Wan"/><br /><sub><b>Kevin Wan</b></sub></a><br /><a href="#talk-kevwan" title="Talks">📢</a> <a href="https://github.com/talkgo/night/commits?author=kevwan" title="Documentation">📖</a></td>
      <td align="center"><a href="https://github.com/Kydaa"><img src="https://avatars1.githubusercontent.com/u/23324176?v=4?s=100" width="100px;" alt="小佳"/><br /><sub><b>小佳</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=Kydaa" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/shima-park"><img src="https://avatars.githubusercontent.com/u/4186507?v=4?s=100" width="100px;" alt="Xingwang Liu"/><br /><sub><b>Xingwang Liu</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=shima-park" title="Code">💻</a></td>
      <td align="center"><a href="https://flow.visionhope.cn"><img src="https://avatars.githubusercontent.com/u/20399569?v=4?s=100" width="100px;" alt="零件"/><br /><sub><b>零件</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=ionling" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/jaydenwen123"><img src="https://avatars.githubusercontent.com/u/38454179?v=4?s=100" width="100px;" alt="jaydenwen123"/><br /><sub><b>jaydenwen123</b></sub></a><br /><a href="#talk-jaydenwen123" title="Talks">📢</a></td>
      <td align="center"><a href="https://space.bilibili.com/26194591"><img src="https://avatars.githubusercontent.com/u/22375523?v=4?s=100" width="100px;" alt="roseduan"/><br /><sub><b>roseduan</b></sub></a><br /><a href="#talk-roseduan" title="Talks">📢</a></td>
      <td align="center"><a href="https://github.com/yedf"><img src="https://avatars.githubusercontent.com/u/6055142?v=4?s=100" width="100px;" alt="yedf"/><br /><sub><b>yedf</b></sub></a><br /><a href="#talk-yedf" title="Talks">📢</a></td>
      <td align="center"><a href="https://dreamerjonson.com/"><img src="https://avatars.githubusercontent.com/u/42735226?v=4?s=100" width="100px;" alt="jonson"/><br /><sub><b>jonson</b></sub></a><br /><a href="#talk-dreamerjackson" title="Talks">📢</a></td>
      <td align="center"><a href="https://taoshu.in"><img src="https://avatars.githubusercontent.com/u/2030591?v=4?s=100" width="100px;" alt="epii1"/><br /><sub><b>epii1</b></sub></a><br /><a href="#talk-epii1" title="Talks">📢</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/talkgo/night/commits?author=eltociear" title="Documentation">📖</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!


================================================
FILE: SHARE_REQUEST_PROPOSAL.md
================================================
# 如何发起分享提案?

## 背景

你是否经常困扰于某些 Go 话题没有人分享或者很少人关注?自己很想深入研究,但是却是形单影只,经常半途而废呢?

Go 夜读提供给大家一种渠道,希望可以将探究深入到 Go 的方方面面,只要你愿意跟我们一同推动,那么非常欢迎你来发起分享提案(只需要四步)。

## 你的收获

作为提案的发起人,可以参与到此提案的完整创作过程的,包括提案规范化,提案有效性,提案潜在讲师的招募,讲师分享内容的提前审校与沟通。

## 提案流程

### 第一步

https://github.com/talkgo/night/issues/new?template=share_request.md


填写标题,例如:`提案:如何阅读 Go 源码?`
填写提案正文。(也就是你对此话题的简述和你的一些诉求)

记得给自己的提案添加 👍 哦。(以便于引导更多的小伙伴给你 👍)。

### 第二步

Go 夜读 SIG 小组会审核该提案,标记标签:`提案`、`投票`、`招募`。

🏷 解释:

提案:表示该 issue 是一个提案。
投票:处于投票阶段。(需要在一个月内得到 80 个 👍,才有可能被接受)。
招募:处于话题可接受讲师自愿报名和邀约讲师的阶段。

### 第三步

当此提案达到 30 个 👍,Go 夜读 SIG 小组会将此提案发布到微信公众号上来推广,以引导更多的小伙伴关注,并 👍 提案。

### 第四步

讲师发起分享计划来完成此提案。


================================================
FILE: actions/go.mod
================================================
module night/actions

go 1.24.0

require (
	github.com/dyweb/gommon v0.0.13
	github.com/google/go-github/v29 v29.0.3
	golang.org/x/oauth2 v0.27.0
)

require (
	github.com/google/go-querystring v1.0.0 // indirect
	golang.org/x/crypto v0.45.0 // indirect
)


================================================
FILE: actions/issuesinfo.json
================================================
{
    "title":"TalkGo 读书会月度推荐书单",
    "body":"欢迎大家踊跃推荐好书:\r\n\u003e来这里的小伙伴,一定给你喜欢的推荐书点个赞:+1:,点赞越高的书将有机会被选为 TalkGo 读书会的共读书目。\r\n推荐好书填写要求:\r\n1. 每个 comment 只推荐一本书\r\n2. 必须填写完整书名、作者(作者\u0026译者)、ISBN\r\n3. 必须填写中肯的书评和推荐理由\r\n4. 可以摘录精华文字,也可以附上合法的书籍相关链接\r\n复制以下 markdown 即可填写。\r\n```\r\n## 书名\r\n## 作者\r\n## ISBN\r\n## 分类\r\n文学/历史/传记/科技/经管等\r\n## 推荐语\r\n\u003e推荐语必须是你自己的书评推荐语,不接受非原创推荐语。\r\n## 精华摘录\r\n- 1.\r\n- 2.\r\n## 其他相关资料\r\n豆瓣/微信阅读/京东/Amazon链接,其他读后感、总结等。\r\n```",
    "labels":["推荐书籍"],
    "assignee":["yangwenmai"]
}

================================================
FILE: actions/monthly.go
================================================
package main

import (
	"context"
	"encoding/json"
	"flag"
	"fmt"
	"github.com/dyweb/gommon/util/httputil"
	"github.com/google/go-github/v29/github"
	"golang.org/x/oauth2"
	"io/ioutil"
	"os"
)

type Issue struct {
	Title    string   `json:"title"`
	Body     string   `json:"body"`
	Labels   []string `json:"labels"`
	Assignee []string `json:"assignee"`
}

func main() {

	var cfg string

	flag.StringVar(&cfg, "c", "", "")
	flag.Parse()

	data, err := ioutil.ReadFile(cfg)
	if err != nil {
		panic(err)
	}

	issueInfo := Issue{}
	err = json.Unmarshal(data, &issueInfo)
	if err != nil {
		panic(err)
	}

	var token = os.Getenv("GITHUB_TOKEN")

	hc := httputil.NewUnPooledClient()
	if token != "" {
		ts := oauth2.StaticTokenSource(&oauth2.Token{
			AccessToken: token,
		})
		hc = oauth2.NewClient(context.Background(), ts)
	}

	client := github.NewClient(hc)

	req := &github.IssueRequest{
		Title:     &issueInfo.Title,
		Labels:    &issueInfo.Labels,
		Assignees: &issueInfo.Assignee,
		Body:      &issueInfo.Body,
	}

	closeOldIssues(client, "talkgo", "night", issueInfo.Title)

	issue, resp, err := client.Issues.Create(context.Background(), "talkgo", "night", req)
	if err != nil {

		// err != nil
		// maybe have response useful for debug
		if resp != nil {
			data, err := ioutil.ReadAll(resp.Body)
			if err == nil {
				fmt.Println("github api response :", string(data))
			}
		}

		panic(err)
	}

	fmt.Println("Created new issue %d %s", issue.GetNumber(), issue.GetTitle())

}

func closeOldIssues(client *github.Client, owner, repo string, name string) {

	issues, resp, err := client.Issues.List(context.Background(), false, &github.IssueListOptions{
		State: "open",
	})

	if err != nil {
		if resp != nil {
			data, err := ioutil.ReadAll(resp.Body)
			if err == nil {
				fmt.Println("github api get issues list response :", string(data))
			}
		}
		panic(err)
	}

	c := "closed"
	for _, issue := range issues {

		if issue.GetTitle() != name {
			continue
		}

		_, _, err := client.Issues.Edit(context.Background(), owner, repo, issue.GetNumber(), &github.IssueRequest{
			State: &c,
		})

		if err != nil {
			panic(err)
		}

	}

}


================================================
FILE: archetypes/default.md
================================================
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---



================================================
FILE: config.toml
================================================
baseurl = "https://talkgo.org/"
title = "Go 夜读"
theme = "hugo-material-docs"
metadataformat = "yaml"
canonifyurls = true
sectionPagesMenu = "main"
# Enable Google Analytics by entering your tracking id
googleAnalytics = ""
# Code highlighting options
# Hugo uses Chroma but names are the same as the old pygments highlighter

# Highlight shortcode and code fences (```) will be treated similarly
pygmentscodefences = true

# Change highlight style here.
# For a full list see: https://xyproto.github.io/splash/docs/all.html
pygmentsStyle = "tango" # "emacs" # "autumn" # "manni" # "friendly"

# Other Chroma options can be added here (and in the highlight shortcode in the markdown file)
# See list of supported options: https://gohugo.io/content-management/syntax-highlighting/#options
# for example: pygmentsoptions = "linenos=true"

[params]
	# General information
	author = "Go 夜读 SIG 小组"
	description = "Talk Go - Go source reading and offline technical discussion every Thursday night."
	copyright = "Released under the Apache 2.0 license"

	# Repository
	provider = "GitHub"
	repo_url = "https://github.com/talkgo/night"

	version = ""
	logo = "images/2018-12-11-night-reading-go.jpg"
	favicon = "images/favicon.ico"

	permalink = " "

	# Custom assets
	custom_css = []
	custom_js  = []

	# Syntax highlighting theme
	highlight_css  = ""

	# Theme color, available values are: red, pink, purple, deep-purple, indigo, blue, light-blue, cyan, teal, green, light-green, lime, yellow, amber, orange, deep-orange, brown, grey and blue-grey
	[params.palette]
    	primary = "indigo"
    	accent  = "deep-purple"

    [params.font]
    	text = "Ubuntu"
    	code = "Ubuntu Mono"

[social]
	Github  = "talkgo"
	YouTube = "https://youtube.com/c/talkgo_night"
	Twitter = "talkgo_night"
	Facebook = "https://www.facebook.com/groups/talkgo/"
	Telegram = "https://t.me/talkgo"
	Slakc = "https://talkgo.slack.com"

[blackfriday]
	smartypants	= true
	fractions = true
	smartDashes = true
	plainIDAnchors = true
[outputs]
	home = [ "HTML" ]
	page = [ "HTML" ]

	


================================================
FILE: content/_index.md
================================================
---
title: "Go 夜读"
date: 2018-11-15T12:32:37+08:00
weight: 1
---


================================================
FILE: content/algorithms/2020-12-27.md
================================================
---
title: 2020-12-27 TalkGo 算法之美微信群今日讨论问题
date: 2020-12-27T22:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2020-12-27

---

## 算法之美微信群当日讨论列表

1. Leetcode双周赛第四题:得到连续 K 个 1 的最少相邻交换次数
原题链接:https://leetcode-cn.com/problems/minimum-adjacent-swaps-for-k-consecutive-ones/
2. Q30 用插线板制作章鱼脚状线路
原题链接:https://leetcode-cn.com/leetbook/read/interesting-algorithm-puzzles-for-programmers/9l2pjv/

## TalkGo 算法之美专栏更新

1. [AK F.\*ing leetcode 流浪计划](https://talkgo.org/t/topic/1441)
2. [AK F.\*ing leetcode 流浪计划之并查集](https://talkgo.org/t/topic/1442)


================================================
FILE: content/algorithms/2020-12-28.md
================================================
---
title: 2020-12-28 TalkGo 算法之美第三期第一周第一阶段
date: 2020-12-28T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2020-12-28

---

周一题目的链接:https://talkgo.org/t/topic/1443

## 主题:树的构造

### 先重温下二叉树是怎么构造出来的吧
[108. 将有序数组转换为二叉搜索树](https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/)

### 附加题:
[95. 不同的二叉搜索树 II](https://leetcode-cn.com/problems/unique-binary-search-trees-ii/)
- Tips: 递归



================================================
FILE: content/algorithms/2020-12-29.md
================================================
---
title: 2020-12-29 TalkGo 算法之美第三期第一周第二阶段
date: 2020-12-29T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2020-12-29

---

- 2020.12.29
  TalkGo算法之美群今日讨论问题
  1.  将有序数组转换为二叉搜索树
  题目链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
  题解链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/108-jiang-you-xu-shu-zu-zhuan-huan-wei-e-muuy/(来源:木头(算法之美群内成员))

  2. 不同的二叉搜索树 II
  原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
  题解链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/95-bu-tong-de-er-cha-sou-suo-shu-ii-di-g-qu38/(来源:木头(算法之美群内成员))

  关于如何建设好算法之美群:
  吴俊伟:我觉得可以分两类人,一种是为了找工作而刷题的,一种是单纯为了学习算法。对于前一种可以多找些高频面试题,后一种就按照现在来就好了。提高参与度的话就让大家可以把自己觉得好的题目或者做不出来的题目,又或者是面试遇到的题目发出来让大家看看,一起讨论。
  吴俊伟:还有平台可以不用局限leetcode,洛谷,计蒜客,牛客网,poj都行的
  小林:可以发布一些算法比赛消息
  吴俊伟:不过我们也可以照顾到这些人多发些面试常考的"经典"题



================================================
FILE: content/algorithms/2020-12-30.md
================================================
---
title: 2020-12-30 TalkGo 算法之美第三期第一周第二阶段
date: 2020-12-30T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2020-12-30

---

- 2020.12.30
  TalkGo算法之美群今日讨论问题
  1.  算法之美第三期周三题目
  原题链接以及群友题解(题解见评论):https://talkgo.org/t/topic/1443
  2. 比赛消息
由群成员吴俊伟提供
  牛客2020跨年场
  比赛时间:2020-12-31 21:00:00 - 2021-01-01 00:30:00
  比赛地址:https://ac.nowcoder.com/acm/contest/9854



================================================
FILE: content/algorithms/2021-01-01.md
================================================
title: 2021-01-01 TalkGo 算法之美第三期第一周第三阶段
date: 2021-01-01T08:31:00+08:00

来源:『TalkGo 算法之美』微信群

时间:2021-01-01

---

- 2021.1.1
  TalkGo算法之美群今日讨论要素
  
  1. 算法之美第三期第一周周五题目链接:https://talkgo.org/t/topic/1443
  2. leetcode435. 无重叠区间 (由群友木头提供)
  原题链接:https://leetcode-cn.com/problems/non-overlapping-intervals/
  3. 群友roseduan分享刷题记录
  链接:https://github.com/roseduan/algo-learn
  4. 本周线上讨论会预定于明天(2020.1.2)下午两点举行,欢迎各位来参与讨论。



================================================
FILE: content/algorithms/2021-01-03.md
================================================
---
title: 2021-01-03 TalkGo 算法之美第三期第一周第三阶段
date: 2021-01-03T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2021-01-03

---

- 2021.1.3
  TalkGo算法之美群今日讨论要素
1. leetcode周赛:https://leetcode-cn.com/contest/weekly-contest-222/
  
2. leetcode每日一题: 86. 分隔链表
  原题链接:https://leetcode-cn.com/problems/partition-list/



================================================
FILE: content/algorithms/2021-01-06.md
================================================
---
title: 2021-01-06 TalkGo 算法之美第三期第二周第三阶段
date: 2021-01-06T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2021-01-06

---

- 2021.01.06
- TalkGo算法之美第三期第二周开始啦。
  以下是周三题目的链接:https://talkgo.org/t/topic/1502
  主题:二叉搜索树



================================================
FILE: content/algorithms/2021-01-08.md
================================================
---
title: 2021-01-08 TalkGo 算法之美第三期第二周第三阶段
date: 2021-01-08T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2021-01-08

---

- 2021.01.08
- TalkGo算法之美第三期第二周开始啦。
  以下是周五题目的链接:https://talkgo.org/t/topic/1502
  主题:巧用遍历



================================================
FILE: content/algorithms/2021-01-09.md
================================================
---
title: 2021-01-09 TalkGo 算法之美第三期第三周第二阶段
date: 2021-01-09T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2021-01-9

---

- 2021.10.9 
- TalkGo算法之美群今日讨论要素
  1. leecode每日一题:123. 买卖股票的最佳时机 III
  链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/



================================================
FILE: content/algorithms/2021-01-11.md
================================================
---
title: 2021-01-11 TalkGo 算法之美第三期第三周第一阶段
date: 2021-01-11T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2021-01-11

---

- 2021.1.11
- TalkGo算法之美第三期第三周开始啦。
  以下是周一题目的链接:https://talkgo.org/t/topic/1550
  主题:回溯



================================================
FILE: content/algorithms/2021-01-12.md
================================================
---
title: 2021-01-12 TalkGo 算法之美第三期第三周第二阶段
date: 2021-01-12T08:31:00+08:00
---
来源:『TalkGo 算法之美』微信群

时间:2021-01-12

---

- 2021.1.12
  TalkGo算法之美群今日讨论要素

  1. 百度面试题(群友bill提供):https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/

  2. 腾讯面试题(群友小林提供):https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
  3. 每日一题题解:https://talkgo.org/t/topic/1561
  4. 面试高频题(群友bill提供):https://leetcode-cn.top/#/home


================================================
FILE: content/articles/2018-05-31-batch-del-redis-key.md
================================================
---
title: 批量删除redis中的key
date: 2018-05-31T00:00:00+08:00
---

* **1.首先看图**

![](/images/batch-del-redis-key_one.png)


>* 1.我创建了三个以`go:read`开头的key
>* 2.通过`keys go:read:*`可以全部找出来
>* 3.接下来退出redis-cli,使用`redis-cli -p 6379 keys "go:read*" | xargs redis-cli -p 6379 del`可以批量删除

* **2.查看原理**

![](/images/batch-del-redis-key_two.png)

>* 1.执行`redis-cli -p 6379 keys "go:read*"`控制台输出了需要的key
>* 2.执行`redis-cli -p 6379 keys "go:read*" | xargs -0 echo`,可以看到输出了需要的key,但是有点不一样,双引号被去掉了,这说明数据通过管道传递给了xargs作了相应处理
>* 3.执行`redis-cli -p 6379 keys "go:read*" | xargs redis-cli -p 6379 del`删除了输出的key,这说明xargs对接收到数据分别进行了`redis-cli -p 6379 del`操作

* **3.遇到的问题**

![](/images/batch-del-redis-key_three.png)

>* 1.同样的原理,我设置了三个key,但是这三个key里面包含了双引号,双引号前得加上\转义符
>* 2.使用`redis-cli -p 6379 keys "go:read*" | xargs redis-cli -p 6379 del`,发现没删除
>* 3.通过`redis-cli -p 6379 keys "go:read*" | xargs -0 echo`,发现传输到xargs时把\转义符删掉了,去执行redis del操作的时候key不配,导致删除失败
>* TODO 采用xargs我没找到解决方案,希望各位大神求助,有方法了可以写在下面@~@
>* 


* **4.另一种解决方案**

![](/images/batch-del-redis-key_four.png)

>* `for i in $(redis-cli -p 6379 keys "go:read:*");do redis-cli -p 6379 del "$i";done`
>* 采用shell脚本格式 -> for循环读取key去删除

================================================
FILE: content/articles/2018-11-11-golang-file-lock.md
================================================
---
title: golang 的文件锁操作
date: 2018-11-11T00:00:00+08:00
---

这篇文章给大家介绍一下 golang 的文件锁。我们在使用 golang 开发程序的时候,经常会出现多个 goroutine 操作同一个文件(或目录)的时候,如果不加锁,很容易导致文件中的数据混乱,于是,Flock 应运而生。

Flock 是对于整个文件的建议性锁(不强求 goroutine 遵守),如果一个 goroutine 在文件上获取了锁,那么其他 goroutine 是可以知道的。默认情况下,当一个 goroutine 将文件锁住,另外一个 goroutine 可以直接操作被锁住的文件,原因在于 Flock 只是用于检测文件是否被加锁,针对文件已经被加锁,另一个 goroutine 写入数据的情况,内核不会阻止这个 goroutine 的写入操作,也就是建议性锁的内核处理策略。

## 函数

```go
import "syscall"

func Flock(fd int, how int) (err error)
```

Flock 位于 syscall 包中,fd 参数指代文件描述符,how 参数指代锁的操作类型。

how 主要的参数类型:

* LOCK_SH,共享锁,多个进程可以使用同一把锁,常被用作读共享锁;
* LOCK_EX,排他锁,同时只允许一个进程使用,常被用作写锁;
* LOCK_NB,遇到锁的表现,当采用排他锁的时候,默认 goroutine 会被阻塞等待锁被释放,采用 LOCK_NB 参数,可以让 goroutine 返回 Error;
* LOCK_UN,释放锁;

## 示例

下面的例子来自于 NSQ,位于 `nsq/internal/dirlock`,用于实现对目录的加锁

```go
// +build !windows

package dirlock

import (
	"fmt"
	"os"
	"syscall"
)

// 定义一个 DirLock 的struct
type DirLock struct {
	dir string    // 目录路径,例如 /home/XXX/go/src
	f   *os.File  // 文件描述符
}

// 新建一个 DirLock
func New(dir string) *DirLock {
	return &DirLock{
		dir: dir,
	}
}

// 加锁操作
func (l *DirLock) Lock() error {
	f, err := os.Open(l.dir) // 获取文件描述符
	if err != nil {
		return err
	}
	l.f = f
	err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) // 加上排他锁,当遇到文件加锁的情况直接返回 Error
	if err != nil {
		return fmt.Errorf("cannot flock directory %s - %s", l.dir, err)
	}
	return nil
}

// 解锁操作
func (l *DirLock) Unlock() error {
	defer l.f.Close() // close 掉文件描述符
	return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) // 释放 Flock 文件锁
}
```

## 总结

1. Flock 是建议性的锁,使用的时候需要指定 `how` 参数,否则容易出现多个 goroutine 共用文件的问题
2. `how` 参数指定 `LOCK_NB` 之后,goroutine 遇到已加锁的 Flock,不会阻塞,而是直接返回错误


================================================
FILE: content/articles/2019-11-07-Raft--易于理解的一致性算法.md
================================================
---
title: Raft--易于理解的一致性算法
date: 2019-11-07T00:00:00+23:00
---

这篇文章讲解如何用 go 实现 raft 算法,代码框架来自于 Mit6.824分布式课程

最初,为了学习分布式系统,我了解到了 **Mit 6.824课程**,课程的 lab 需要用 go 来完成。于是 go 走进了我的世界,go 很容易入门, 写起来很舒服,但是要真正的理解 go, 并不是很容易, 特别是对 **goroutine, select, channel** 等的灵活运用。俗话说的好,初生牛犊不怕虎, 在初步了解 go 之后, 我就开始学习课程了。 每个 lab 都会有对应的论文, 比如 mapreduce, raft 等等。 lab2 是**实现 raft** 算法, lab3 是基于 lab2的 raft 算法来 实现一个简单的**分布式 kv 存储**。 在做 lab 的过程中,不仅仅可以对 raft 的细节有更好的把握, 同时对 go 语言的理解也会逐渐加深, 特别是并发部分。

首先看一下**复制状态机**,如下图所示

![复制状态机](https://github.com/DreaMer963/distributed-systems/blob/master/pic/%E5%A4%8D%E5%88%B6%E7%8A%B6%E6%80%81%E6%9C%BA.png)

复制状态机通常是基于复制日志实现的。每一台服务器存储着一个包含一系列指令的日志,每个日志都按照相同的顺序包含相同的指令,所以每一台服务器都执行相同的指令序列。那么如何保证每台服务器上的日志都相同呢? 这就是接下来要介绍的一致性算法raft要做的事情了。

raft 主要分三大部分, **领导选举**, **日志复制**, **日志压缩**。 由于其中的细节很多,所以在实现过程中肯定会遇到各种各样的问题, 这也是一个比较好的事情,因为问题将促使我们不断地深入的去阅读论文, 同时锻炼 debug 并发程序的能力。最后肯定是满满的收获。

实现主要依赖于raft论文中的下图

![](https://github.com/DreaMer963/distributed-systems/blob/master/pic/%E5%9B%BE%E4%BA%8C.png)

代码框架条理清楚。主要包含七个主要的 **struct** , 三个 **RPC handler** , 四个**主干函数** , 如下

```go

// 七个struct
type Raft struct {
    ...
}

type RequestVoteArgs struct {
    ...
}

type RequestVoteReply struct {
    ...
}

type AppendEntriesArgs struct {
    ...
}

type AppendEntriesReply struct {
    ...
}

type InstallSnapShotArgs struct {
    ...
}

type InstallSnapShotReply struct {
    ...
}

// 三个 RPC handler

// RequestVote RPC handler
func (rf *Raft) RequestVote(args *RequestVoteArgs, reply *RequestVoteReply) {
    ...
}

// AppendEntries RPC handler
func (rf *Raft) AppendEntries(args *AppendEntriesArgs, reply *AppendEntriesReply) {
    ...
}

// InstallSnapShot RPC handler
func (rf *Raft) InstallSnapShot(args* InstallSnapShotArgs, reply* InstallSnapShotReply) {
    ...
}

// 四个主干函数
func (rf* Raft) electForLeader() {
    ...
}

func (rf* Raft) appendLogEntries() {
    ...
}

func (rf* Raft) transmitSnapShot(server int)  {
    ...
}

// 包含一个后台 goroutine. 
func Make(peers []*labrpc.ClientEnd, me int, persister *Persister, applyCh chan ApplyMsg) *Raft {
        ...
        go func() {
            for {
                electionTimeout := time.Duration(rand.Intn(200) + 300) * time.Millisecond
                switch state {
                case "follower", "candidate":
                    // if receive rpc, then break select, reset election tim
                    select {
                    case <-rf.ch:
                    case <-time.After(electionTimeout):
                    //become Candidate if time out
                        rf.changeRole("candidate")
                    }
                case "leader":
                    time.Sleep(heartbeatTime) 
                    rf.appendLogEntries()
                }
            }
        }()
}

```

下面的部分, 记录了三大部分的主干和我认为的容易出错的地方。

### 领导选举

------

**1**. **electForLeader** 函数主干,候选人针对每一个 peer 发送**请求投票RPC**

   ```go
   for i:=0; i<len(rf.peers); i++ {
       // meet myself
       if i==rf.me {
           continue
       }
       go func(index int) {
           reply := &RequestVoteReply{}
           response := rf.sendRequestVote(index, &args, reply)
           if response {
               ...
           }
       }(i)
   }
   ```

**2**. 获得响应后,要将 reply 的 term 于 candidate 的 currentTerm 进行比较

   ```go
   if reply.Term > rf.currentTerm {
       rf.currentTerm = reply.Term
       rf.changeRole("follower")
       return
   }
   ```

**3**. 获得响应后,候选人要检查自己的 **state** 和 **term** 是否因为发送**RPC**而改变

   ```go
   if rf.state != "candidate" || rf.currentTerm!= args.Term { return }
   ```

**4**. 若候选人获得的投票超过**半数**,则变成领导人

**5**. **请求投票PRC** ⭐(接收者指接收 *请求投票PRC* 的 peer)

- 如果 **candidate 的 term 小于接收者的 currentTerm**, 则不投票,并且返回接收者的 currentTerm

     ```go
     reply.VoteGranted = false
     reply.Term = rf.currentTerm
     if rf.currentTerm > args.Term { return }
     ```

- 如果**接收者的 votedFor 为空或者为 candidateId,并且 candidate 的日志至少和接收者一样新**,那么就投票给候选人。candidate 的日志至少和接收者**一样新**的含义:**candidate 的最后一个日志条目的 term 大于接收者的最后一个日志条目的 term 或者当二者相等时,candidate 的最后一个日志条目的 index 要大于等于接收者的**

     ```go
     if (rf.votedFor==-1 || rf.votedFor==args.CandidateId) &&
        (args.LastLogTerm > rf.getLastLogTerm() ||
      ((args.LastLogTerm==rf.getLastLogTerm())&& (args.LastLogIndex>=rf.getLastLogIndex()))) {
            reply.VoteGranted = true
            rf.votedFor = args.CandidateId
            rf.state = "follower"   // rf.state can be follower or candidate
            ...
     }
     ```

------

### 日志复制

**1**. **appendLogEntries** 函数的主干,leader 针对每一个 peer 发送**附加日志 RPC**

   ```go
   for i:=0; i<len(rf.peers); i++ {
       if i == rf.me {
           continue
       }
       go func(index int) {
           reply := &AppendEntriesReply{}
           respond := rf.sendAppendEntries(index, &args, reply)
           if reply.Success {
               ...
               return
           } else {
               ...
           }
       }(i)
   }
   ```

**2**. 获得响应后,要将 reply 的 term 于 leader 的 currentTerm 进行比较

**3**. 获得响应后,候选人要检查自己的 **state** 和 **term** 是否因为发送**RPC** 而改变

**4**. **回复成功**

- 更新 **nextIndex**, 即 leader 需要发送给该 peer 下一条日志条目的索引值 , 更新 **matchIndex**, 即 leader 已经复制给该 peer 的日志的最高索引值

    ```go
    rf.matchIndex[index] = args.PrevLogIndex + len(args.Entries)
    rf.nextIndex[index] = rf.matchIndex[index] + 1
    ```

- 如果存在一个 N 满足 **N>commitIndex**,并且大多数 **matchIndex[i] > N** 成立,并且 **log[N].term == currentTerm**,则更新 **commitIndex=N**

**5**. **回复不成功**

- 更新 **nextIndex**,然后重试

**6**. **附加日志RPC** ⭐

- 几个再次明确的地方:

  - **preLogIndex** 的含义:新的日志条目(s)紧随之前的索引值,是针对每一个follower而言的==nextIndex[i]-1,每一轮重试都会改变。

  - **entries[]** 的含义:准备存储的日志条目;表示心跳时为空

    ```go
    append(make([]LogEntry, 0), rf.log[rf.nextIndex[index]-rf.LastIncludedIndex:]...)
    ```

- **领导人获得权力**后,初始化所有的 nextIndex 值为自己的最后一条日志的 index+1;如果一个 follower 的日志跟领导人的不一样,那么在附加日志 PRC 时的一致性检查就会失败。领导人选举成功后跟随者可能的情况

![](https://github.com/DreaMer963/distributed-systems/blob/master/pic/appendLog.jpg)

- reply增加 **ConflictIndex** 和 **ConflictTerm** 用于记录日志冲突 index 和 term

- 如果 **leader 的 term 小于接收者的 currentTerm**, 则 reply false.

- **接下来就三种情况** ⭐(比较绕且容易出错)

    1. **follower 的日志长度比 leader 的短**, 那么 **ConflictIndex** 就是 follower 的 日志长度。之后在 **appendLogEntries** 函数里面会更新 **nextIndex** 为 ConflictIndex, 相应的 **prevLogIndex** 也会改变, 于是在下一轮RPC中便可以比较 follower 的日志条目在 **arg.PrevLogIndex** 索引处的 **Term** 是否等于 **args.PrevLogTerm**, 如果相等, 则该可以把 leader 在 **arg.PrevLogIndex** 后面的一次性全部添加到 follower 的日志条目上, 从而达成一致性, 否则令 **ConflictTerm** 为 follower 的日志条目在 **arg.PrevLogIndex** 索引处的 **Term**, 然后从头遍历 follower 的日志条目, 找到**第一个 term 等于 ConflictTerm 的 索引**, 用来更新 **ConflictIndex**
    2. **follower 的日志长度比 leader 的长,且在 prevLogIndex 处的 term 相等**, 则开始依次对比 follower 在 **arg.prevLogIndex** 后的日志条目在何处跟 **entries** 上相应的日志的 **term** 不一致, 假设该索引为 **idx**, 那么 follower 在索引后的日志条目应该被替换为 **entries** 在 该索引后的日志条目, 最终达成一致性
    3. **follower 的日志长度比 leader 的长,且在 prevLogIndex 处的 term 不相等**, 之后便是去寻找 **ConflictTerm** 然后更新 **ConflictIndex**,  直到在 prevLogIndex 处的 term 相等, 然后按照 **2** 进行处理.
    ```go
    if args.PrevLogIndex >=rf.LastIncludedIndex && args.PrevLogIndex < rf.logLen() {
		if args.PrevLogTerm != rf.log[args.PrevLogIndex-rf.LastIncludedIndex].Term {
			reply.ConflictTerm = rf.log[args.PrevLogIndex-rf.LastIncludedIndex].Term
			//  then search its log for the first index
			//  whose entry has term equal to conflictTerm.
			for i:=rf.LastIncludedIndex; i<rf.logLen(); i++ {
				if rf.log[i-rf.LastIncludedIndex].Term==reply.ConflictTerm {
					reply.ConflictIndex = i
					break
				}
			}
			return
		}
	}else {
		reply.ConflictIndex = rf.logLen()
		return
	}

	index := args.PrevLogIndex
	for i:=0; i<len(args.Entries); i++ {
		index++
		if index >= rf.logLen() {
			rf.log = append(rf.log, args.Entries[i:]...)
			rf.persist()
			break
		}
		if rf.log[index-rf.LastIncludedIndex].Term != args.Entries[i].Term {
			rf.log = rf.log[:index-rf.LastIncludedIndex]
			rf.log = append(rf.log, args.Entries[i:]...)
			rf.persist()
			break
		}
	}
    ```

- 如果 **leaderCommit > commitIndex**,令 commitIndex 等于 leaderCommit  和新日志条目索引值中较小的一个

------


### 日志压缩

**1**. 采用日志压缩,不仅可以减少本地占用的空间和每次重置的时间花销, 还可以直接通过网络把快照发给那些落后的跟随者,使他们更新到最新的状态

**2**. 下图为 Raft 中快照的基本思想, 快照中包含**状态机的状态, LastIncludeIndex: 被快照取代的最后的条目在日志中的索引值, LastIncludedTerm: 该条目的任期号**,保留这些数据是为了支持快照后紧接着的第一个条目的附加日志请求时的一致性检查

![](https://github.com/DreaMer963/distributed-systems/blob/master/pic/log-compact.jpg)

**3**. **安装快照RPC**

- 尽管服务器通常都是独立的创建快照,但是领导人必须偶尔的发送快照给一些落后的跟随者

- 三种情况

    - leader 的 **LastIncludedIndex** 小于等于 follower 的  **LastIncludeIndex**
    - leader 的 **LastIncludedIndex** 大于 follower 的 **LastIncludeIndex**,leader 的 **LastIncludedIndex** 小于 follower 日志的最大索引值
    - leader 的 **LastIncludedIndex** 大于等于 follower 日志的最大索引值

    **对应的处理方式**
    - 如果接收到的快照是自己日志的前面部分,那么快照包含的条目将全部被删除,但是快照后面的条目仍然有效,要保留
    - 如果快照中包含没有在接收者日志中存在的信息,那么跟随者丢弃其整个日志,全部被快照取代。

------

### 总结

**1**. 个人认为看一两遍论文就掌握 raft 还是比较困难的, 所以当对 raft 有了大致了解之后, 就可以开始实现了, 遇到问题后带着问题去读, 反复咀嚼, 逐渐加深对 raft 的理解

**2**. 推荐看一下这个: [raft 可视化](http://thesecretlivesofdata.com/raft/), 可以对 raft 有一个直观的感受


================================================
FILE: content/articles/2020-02-08-source_go_flag.md
================================================
---
title: "Go 源码阅读之 flag 包"
date: 2020-02-08T17:54:04+08:00
---

- [简介](#%e7%ae%80%e4%bb%8b)
- [文件结构](#%e6%96%87%e4%bb%b6%e7%bb%93%e6%9e%84)
- [运行测试](#%e8%bf%90%e8%a1%8c%e6%b5%8b%e8%af%95)
- [总结](#%e6%80%bb%e7%bb%93)
	- [接口转换能实现类似 C++ 中模板的功能](#%e6%8e%a5%e5%8f%a3%e8%bd%ac%e6%8d%a2%e8%83%bd%e5%ae%9e%e7%8e%b0%e7%b1%bb%e4%bc%bc-c-%e4%b8%ad%e6%a8%a1%e6%9d%bf%e7%9a%84%e5%8a%9f%e8%83%bd)
	- [函数 vs 方法](#%e5%87%bd%e6%95%b0-vs-%e6%96%b9%e6%b3%95)
	- [`new` vs `make`](#new-vs-make)
	- [指针赋值给接口变量](#%e6%8c%87%e9%92%88%e8%b5%8b%e5%80%bc%e7%bb%99%e6%8e%a5%e5%8f%a3%e5%8f%98%e9%87%8f)
	- [flag文件夹中有`flag_test`包](#flag%e6%96%87%e4%bb%b6%e5%a4%b9%e4%b8%ad%e6%9c%89flagtest%e5%8c%85)
	- [作用域](#%e4%bd%9c%e7%94%a8%e5%9f%9f)
- [参考文献](#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%ae)

## 简介
flag 包是 Go 里用于解析命令行参数的包。为什么选择它作为第一个阅读的包,因为它的代码量少。其核心代码只有一个 1000 不到的 flag.go 文件。

## 文件结构
flag 包的文件结构很简单,就一层。一个文件夹里放了 5 个文件,其文件及其作用如下:

* flag.go 
  
  flag 的核心包,实现了命令行参数解析的所有功能
* export_test.go
  
  测试的实用工具,定义了所有测试需要的基础变量和函数
* flag_test.go 
  
  flag 的测试文件,包含了 17 个测试单元
* example_test.go
  
  flag 的样例文件,介绍了 flag 包的三种常用的用法样例
* example_value_test.go 
  
  flag 的样例文件,介绍了一个更复杂的样例

## 运行测试
我先介绍一下 Go 的运行环境。
```bash
# 通过 brew install go 安装,源码位置为 $GOROOT/src
GOROOT=/usr/local/opt/go/libexec
# 阅读的源码通过 go get -v -d github.com/haojunyu/go 下载,源码位置为 $GOPATH/src/github.com
GOPATH=$HOME/go
```

单独测试 flag 包踩过的坑:
1. 无法针对单个文件进行测试,需要针对包。

这里重点说一下 export_test.go 文件,它是flag包的一部分`package flag`,但是它确实专门为测试而存在的,说白了也就一个`ResetForTesting`方法,用来清除所有命令参数状态并且直接设置Usage函数。该方法会在测试用例中被频繁使用。所以单独运行以下命令会报错"flag_test.go:30:2: undefined: ResetForTesting"
```bash
# 测试当前目录(报错)
go test -v .
# 测试包
go test -v flag
```

2. `go test -v flag` 测试的源码是 `$GOROOT/src` 下的(以我当前的测试环境)

指定 flag 包后,实际运行的源码是 `$GOROOT` 下的,这个应该和我的安装方式有关系。

## 总结
### 接口转换能实现类似 C++ 中模板的功能
flag 包中定义了一个结构体类型叫 `Flag`,它用来存放一个命令参数,其定义如下。
```go
// A Flag represents the state of a flag.
// 结构体Flag表示一个参数的所有信息,包括名称,帮助信息,实际值和默认值
type Flag struct {
	Name     string // name as it appears on command line名称
	Usage    string // help message帮助信息
	Value    Value  // value as set实现了取值/赋值方法的接口
	DefValue string // default value (as text); for usage message默认值
}
```
其中命令参数的值是一个 `Value` 接口类型,其定义如下:
```go
// Set is called once, in command line order, for each flag present.
// The flag package may call the String method with a zero-valued receiver,
// such as a nil pointer.
// 接口Value是个接口,在结构体Flag中用来存储每个参数的动态值(参数类型格式各样)
type Value interface {
	String() string   // 取值方法
	Set(string) error // 赋值方法
}
```
为什么这么做?因为这样做能够实现类似模板的功能。任何一个类型 `T` 只要实现了 `Value` 接口里的 `String` 和 `Set` 方法,那么该类型 `T` 的变量 `v` 就可以转换成 `Value` 接口类型,并使用 `String` 来取值,使用 `Set` 来赋值。这样就能完美的解决不同类型使用相同的代码操作目的,和 C++ 中的模板有相同的功效。


### 函数 vs 方法
函数和方法都是一组一起执行一个任务的语句,二者的区别在于调用者不同,函数的调用者是包 package,而方法的调用者是接受者 receiver。在 flag 的源码中,有太多的函数里面只有一行,就是用包里的变量 `CommandLine` 调用同名方法。
```go
// Parsed reports whether f.Parse has been called.
// Parsed方法: 命令行参数是否已经解析
func (f *FlagSet) Parsed() bool {
	return f.parsed
}

// Parsed reports whether the command-line flags have been parsed.
func Parsed() bool {
	return CommandLine.Parsed()
}
```

### `new` vs `make`
`new` 和 `make` 是 Go 语言中两种内存分配原语。二者所做的事情和针对的类型都不一样。
`new` 和其他编程语言中的关键字功能类似,都是向系统申请一段内存空间来存储对应类型的数据,但又有些区别,区别在于它会将该片空间置零。也就是说 `new(T)` 会根据类型 `T` 在堆上 申请一片置零的内存空间,并返回指针 `*T`。
`make` 只针对切片,映射和信道三种数据类型 `T` 的构建,并返回类型为 `T` 的一个已经初始化(而非零)的值。原因是这三种数据类型都是引用数据类型,在使用前必须初始化。就像切片是一个具有三项内容的描述符,包含一个指向数组的指针,长度和容量。通过 `make` 创建对应类型的变量过程是先分配一段空间,接着根据对应的描述符来创建对应的类型变量。关于 `make` 的细节可以看 draveness 写的 [Go语言设计与实现](book_golang)。
```go
// Bool defines a bool flag with specified name, default value, and usage string.
// The return value is the address of a bool variable that stores the value of the flag.
func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
	p := new(bool)
	f.BoolVar(p, name, value, usage)
	return p
}


// sortFlags returns the flags as a slice in lexicographical sorted order.
// sortFlags函数:按字典顺序排序命令参数,并返回Flag的切片
func sortFlags(flags map[string]*Flag) []*Flag {
	result := make([]*Flag, len(flags))
	i := 0
	for _, f := range flags {
		result[i] = f
		i++
	}
	sort.Slice(result, func(i, j int) bool {
		return result[i].Name < result[j].Name
	})
	return result
}
```


### 指针赋值给接口变量
Go 中的接口有两层含义,第一层是一组方法(不是函数)的签名,它需要接受者(具体类型 `T` 或具体类型指针 `*T` )来实现细节;另一层是一个类型,而该类型能接受所有现实该接受的接受者。深入理解接口的概念可以细读 [Go语言设计与实现之接口](book_golang_interface)。在 flag 包中的 `StringVar` 方法中`newStringValue(value, p)`返回的是 `*stringValue` 类型,而该类型(接受者)实现了 `Value` 接口( `String` 和 `Set` 方法),此时该类型就可以赋值给 `Value` 接口变量。
```go
// StringVar defines a string flag with specified name, default value, and usage string.
// The argument p points to a string variable in which to store the value of the flag.
// StringVar方法:将命令行参数的默认值value赋值给变量*p,并生成结构Flag并置于接受者中f.formal
func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
	f.Var(newStringValue(value, p), name, usage) // newStringValue返回值是*stringValue类型,之所以能赋值给Value接口是因为newStringValue实现Value接口时定义的接受者为*stringValue
}
```


### flag文件夹中有`flag_test`包
flag 文件夹下有 `flag_test` 包,是因为该文件夹下包含了核心代码 flag.go 和测试代码 *_test.go 。这两部分代码并没有通过文件夹来区分。所以该 `flag_test` 包存在的意义是将测试代码与核心代码区分出来。而该包被引用时只会使用到核心代码。
```go
// example_test.go
package flag_test
```

### 作用域 
关于作用域 [Golang变量作用域](blog_varScope) 和 [GO语言圣经中关于作用域](go_bible) 都有了详细的介绍,前者更通俗易懂些,后者更专业些。在 flag 包的 `TestUsage` 测试样例中,因为 `func(){called=true}` 是在函数 `TestUsage` 中定义函数,并且直接作为形参传递给 `ResetForTesting` 函数,所以该函数是和局部变量 `called` 是同级的,当然在该函数中给该变量赋值也是合理的。
```go
//  called变量的作用域
func TestUsage(t *testing.T) {
	called := false
	// 变量called的作用域
	ResetForTesting(func() { called = true })
	if CommandLine.Parse([]string{"-x"}) == nil {
		t.Error("parse did not fail for unknown flag")
	} else {
		t.Error("hahahh")
	}
	if !called {
		t.Error("did not call Usage for unknown flag")
	}
}
```


## 参考文献
1. [Go 夜读之 flag 包视频](video_nightreading)
2. [实效 Go 编程之内存分配](book_effectGo)
3. [Go 语言设计与实现之 make 和 new](book_golang_makeNew)
4. [菜鸟教程之 Go 语言变量作用域](runoob_varScope)
5. [Go 语言圣经中关于作用域](go_bible)
6. [Go 语言中值 receiver 和指针 receiver 的对比](blog_receiver)
7. [Go CodeReviewComments](gowiki_receiver)
8. [Golang 变量作用域](blog_varScope)
9. [Go 语言圣经中关于作用域](go_bible)
10. [Go 语言设计与实现之接口](book_golang_interface)

[book_effectGo]: https://go-zh.org/doc/effective_go.html#new%E5%88%86%E9%85%8D
[book_golang_makeNew]:https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/
[github_goSource]: https://github.com/haojunyu/go
[runoob_varScope]: https://www.runoob.com/go/go-scope-rules.html
[book_goBible]:https://docs.hacknode.org/gopl-zh/ch2/ch2-07.html
[blog_reflect]:https://juejin.im/post/5a75a4fb5188257a82110544
[book_golang_interface]:https://draveness.me/golang/docs/part2-foundation/ch04-basic/golang-interface/#42-
[video_nightreading]: https://www.bilibili.com/video/av45158627

[blog_receiver]: https://maiyang.me/post/2018-12-12-values-receiver-vs-pointer-receiver-in-golang
[gowiki_receiver]: https://github.com/golang/go/wiki/CodeReviewComments#receiver-type


================================================
FILE: content/articles/_index.md
================================================
---
title: "分享文章"
date: 2018-11-15T12:32:37+08:00
weight: 5
---


================================================
FILE: content/articles/goroutine_and_channel/README.md
================================================
# goroutine和通道
<!-- TOC -->

- [goroutine和通道](#goroutine%e5%92%8c%e9%80%9a%e9%81%93)
	- [goroutine和通道](#goroutine%e5%92%8c%e9%80%9a%e9%81%93-1)
		- [CSP并发模型](#csp%e5%b9%b6%e5%8f%91%e6%a8%a1%e5%9e%8b)
		- [goroutine的调度模型](#goroutine%e7%9a%84%e8%b0%83%e5%ba%a6%e6%a8%a1%e5%9e%8b)
		- [Go协程和主线程](#go%e5%8d%8f%e7%a8%8b%e5%92%8c%e4%b8%bb%e7%ba%bf%e7%a8%8b)
		- [goroutine入门](#goroutine%e5%85%a5%e9%97%a8)
			- [设置Golang运行的CPU数](#%e8%ae%be%e7%bd%aegolang%e8%bf%90%e8%a1%8c%e7%9a%84cpu%e6%95%b0)
		- [管道](#%e7%ae%a1%e9%81%93)
			- [加锁](#%e5%8a%a0%e9%94%81)
			- [引入管道](#%e5%bc%95%e5%85%a5%e7%ae%a1%e9%81%93)
			- [channel介绍](#channel%e4%bb%8b%e7%bb%8d)
		- [协程和管道](#%e5%8d%8f%e7%a8%8b%e5%92%8c%e7%ae%a1%e9%81%93)
		- [代码效率](#%e4%bb%a3%e7%a0%81%e6%95%88%e7%8e%87)
	- [golang管道细节总结](#golang%e7%ae%a1%e9%81%93%e7%bb%86%e8%8a%82%e6%80%bb%e7%bb%93)
		- [细节1](#%e7%bb%86%e8%8a%821)
		- [细节2](#%e7%bb%86%e8%8a%822)
		- [细节3](#%e7%bb%86%e8%8a%823)

<!-- /TOC -->

## goroutine和通道

### CSP并发模型

用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型

Golang 就是借用CSP模型的一些概念为之实现并发进行理论支持

process是在go语言上的表现就是 goroutine 是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。


### goroutine的调度模型

MPG模型

M: 操作系统的主线程

P: 协程执行所需要的上下文

G:协程


[具体了解可以点击这里](https://www.jianshu.com/p/36e246c6153d)

### Go协程和主线程

1、Go主线程(线程或者叫进程):一个Go主线程,可以起多个协程,协程就是轻量级的线程

2、Go协程的特点

>有独立的栈空间

>共享程序堆空间

>调度由用户控制

>协程是轻量级的线程【编译器做优化】

**问题:**

**`什么是栈空间&堆空间?`**

> 栈空间?
> **编译器自动分配释放**,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
>
>堆空间?
>**一般是由程序员分配释放**,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表

**`怎么理解这段话?`**

注意我们此处谈到的堆和栈是对操作系统中的,这个和数据结构中的堆和栈还是又一定区别的。

栈: 可以简单得理解成**一次函数调用内部申请到的内存,它们会随着函数的返回把内存还给系统**。

```go
func F() {
    temp := make([]int, 0, 20)
    ...
}
```
类似于上面代码里面的temp变量,只是内函数内部申请的临时变量,并不会作为返回值返回,它就是被编译器申请到栈里面。

申请到 栈内存 好处:**函数返回直接释放,不会引起垃圾回收,对性能没有影响。**


再来看看堆得情况之一如下代码:
```go
func F() []int{
    a := make([]int, 0, 20)
    return a
}
```
而上面这段代码,申请的代码一模一样,但是申请后作为返回值返回了,编译器会认为变量之后还会被使用,当函数返回之后并不会将其内存归还,那么它就会被申请到 堆 上面了。

申请到堆上面的内存才会引起垃圾回收,如果这个过程(特指垃圾回收不断被触发)过于高频就会导致 gc 压力过大,程序性能出问题。

参考文献:

[Golang内存分配逃逸分析](https://driverzhang.github.io/post/golang%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E9%80%83%E9%80%B8%E5%88%86%E6%9E%90/)

[Go的变量到底在堆还是栈中分配](http://www.zenlife.tk/go-allocated-on-heap-or-stack.md)

后面我会单独出一章介绍Golang 堆空间&栈空间理解


### goroutine入门

例子:
```go
package main

import (
	"fmt"
	"strconv"
	"time"
)

func test() {
	for i := 1; i <= 10; i++ {
		fmt.Println("test () hello world" + strconv.Itoa(i))
		time.Sleep(time.Second)
	}
}

func main() {

	// test()
	go test() //开启一个协程
	for i := 1; i <= 10; i++ {
		fmt.Println("main () hello golang" + strconv.Itoa(i))
		time.Sleep(time.Second)
	}

}

```

运行结果:
```
main () hello golang1
test () hello world1
test () hello world2
main () hello golang2
test () hello world3
main () hello golang3
main () hello golang4
test () hello world4
test () hello world5
main () hello golang5
main () hello golang6
test () hello world6
test () hello world7
main () hello golang7
main () hello golang8
test () hello world8
main () hello golang9
test () hello world9
main () hello golang10
test () hello world10
```

运行结果: **说明main这个主线程和test协程同时运行**


可以画个逻辑图来说明这个情况:

![Alt text](https://raw.githubusercontent.com/Syncma/Figurebed/master/img/逻辑图.png)



逻辑图讲解:

1、主线程是一个物理线程、直接作用在CPU上、是重量级的,非常耗费CPU资源

2、协程是主线程开启的,是轻量级的线程,是逻辑态,对资源消耗相对小

3、Golang的协程机制是重要的特点,可以轻松开启上万个协程

其他编程语言的开发机制一般基于线程,开启过多的线程,资源耗费大

这里就凸显了golang在并发上的优势了



#### 设置Golang运行的CPU数

注意:
>1、Go1.8之前 要进行设置下 可以更高效的利用CPU

>2、GO1.8之后 默认让程序运行在多个核上 可以不用设置

这里使用的是**go version go1.13.1** 

```go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	cpuNum := runtime.NumCPU()
	fmt.Println("cpunum:", cpuNum)

	//可以自己设置使用多个CPU
	runtime.GOMAXPROCS(cpuNum - 1)
	fmt.Println("ok")
}

```



### 管道

看一个例子来解释为什么要用到管道这个技术?

```go
package main

import (
	"fmt"
	"time"
)

var (
	myMap = make(map[int]int, 10)
)

func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res *= i

	}

	myMap[n] = res

}

func main() {

	for i := 1; i <= 200; i++ {
		go test(i)
	}

	time.Sleep(time.Second * 10)

	//遍历结果
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d\n", i, v)
	}

}

```

运行结果:
```
map[76]=0
map[81]=0
map[104]=0
map[117]=0
map[118]=0
map[124]=0
map[139]=0
map[153]=0
map[162]=0
map[2]=2
map[16]=20922789888000
....

```


发现的问题:

**`多个协程 同时写 会出现资源竞争`**

<br>
解决思路:

####  加锁
全局变量加锁同步

没有对全局变量加锁,会出现资源竞争问题,代码会报错: concurrent map writes

加入互斥锁

```go
package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	myMap = make(map[int]int, 10)

	//声明全局互斥锁
	//lock 是一个全局互斥锁
	//sync 表示同步
	//Mutex 表示互斥
	lock sync.Mutex
)

func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res *= i

	}

	//加锁
	lock.Lock()
	myMap[n] = res

	//解锁
	lock.Unlock()

}

func main() {

	for i := 1; i <= 200; i++ {
		go test(i)
	}

	//休眠几秒合适?
	time.Sleep(time.Second * 10)

	//遍历结果
	lock.Lock()
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d\n", i, v)
	}
	lock.Unlock()

}

```

遍历结果也要加入锁机制, 原因:

程序从设计上可以指定10秒执行了所有协程,但是主线程并不知道,因此底层可能仍然出现资源争夺


#### 引入管道
前面使用全局变量加锁解决 但不完美:

主要有三个地方:

>1)主线程在等待所有gorouting全部完成的时间很难确定,这里设置了10秒,仅仅是估算

>2)如果主线程休眠时间长了,会加长等待时间
    如果等待时间短了,可能还有goroutine处于工作状态,
    这时会随着主线程的退出而销毁

>3)通过全局变量加锁,也并不利用协程对全局变量的读写操作(不知道在哪里加锁、释放锁)


#### channel介绍

1.主要有下面几个特点:

>1.Channel本质就是一个数据结构 -队列

>2.数据是先进先出

>3.线程安全,多goroutine访问时,不需要加锁,就是说channel本身就是线程安全

>4.channel是有类型的,一个string的channel只能存放string类型数据


2.基本使用:
```
定义 /声明 channel
var 变量 chan  数据类型
var intChan  chan int

说明:
1)channel是引用类型
2)channel必须初始化才能写入数据、即make后才能使用

```

3.例子

```go
package main

import (
	"fmt"
)

func main() {
	var intChan chan int
	intChan = make(chan int, 3)

	fmt.Printf("intChan的值=%v\n", intChan) //intChan的值=0xc00001a100

}
```


4.管道写入

例子1:
```go
package main

import (
	"fmt"
)

func main() {
	var intChan chan int
	intChan = make(chan int, 3)

	fmt.Println()

	//管道写入
	intChan <- 10
	num := 211
	intChan <- num

	//管道长度和容量
	fmt.Printf("channel len=%v cap=%v", len(intChan), cap(intChan))

}

```

例子2:

```go
package main

import (
    "fmt"
)

func main() {
    var intChan chan int
    intChan = make(chan int, 3)

    fmt.Println()

    //管道写入
    intChan <- 10
    num := 211
    intChan <- num

    //当写入数据不能超过容量,超过报错
    intChan <- 50
    intChan <- 98

    //管道长度和容量
    fmt.Printf("channel len=%v cap=%v", len(intChan), cap(intChan))

}
```

例子3:

```go
package main

import (
    "fmt"
)

func main() {
    var intChan chan int
    intChan = make(chan int, 3)

    fmt.Println()

    //管道写入
    intChan <- 10
    num := 211
    intChan <- num

    //当写入数据不能超过容量
    intChan <- 50

    //管道长度和容量
    fmt.Printf("channel len=%v cap=%v\n", len(intChan), cap(intChan))

    //读数据
    var num2 int
    num2 = <-intChan
    fmt.Println("num2=", num2)
    fmt.Printf("channel len=%v cap=%v\n", len(intChan), cap(intChan))

    //在没有使用协程的情况下,管道数据已经全部取出,再取就会报错deadlock
    num3 := <-intChan
    num4 := <-intChan
    num5 := <-intChan

    fmt.Println("num3=", num3, "num4=", num4, "num5=", num5)

}
```

5.管道细节总结:

>1.channel只能存放指定的数据类型

>2.channel的数据放满后,就不能再放入了

>3.如果从channel取出数据后,可以继续放入

>4.在没有使用协程的情况下,如果channel数据取完了再取, 就会报deadlock



6.channel的关闭

使用内置函数close可以关闭channel,当channel关闭后 就不能再向channel写数据

但是可以从channel读取数据

```go
package main

func main() {
	intChan := make(chan int, 3)

	intChan <- 100
	intChan <- 200
	close(intChan)
	intChan <- 300  //panic: send on closed channel
}

```


7.channel的遍历

支持for-range的方式来遍历:

1.在遍历时,如果channel没有关闭,则出现deadlock

2.在遍历时,如果channel已经关闭,会正常遍历数据,遍历完后会退出遍历


```go
package main

import "fmt"

func main() {
	intChan := make(chan int, 100)

	for i := 0; i < 100; i++ {
		intChan <- i * 2

	}

	//遍历,不能使用普通的for循环,取出来的不是值
	// for i := 0; i < len(intChan); i++ {
	//  fmt.Println("i=", i)
	// }

	//使用for-range循环,取出来的是值
	close(intChan)
	for v := range intChan {
		fmt.Println("v=", v)
	}

}

```

### 协程和管道


![Alt text](https://raw.githubusercontent.com/Syncma/Figurebed/master/img/协程与管道.png)

看一个例子:
```go
package main

import (
	"fmt"
)

//write data
func writeData(intChan chan int) {
	for i := 1; i <= 50; i++ {
		intChan <- i
		fmt.Printf("writeData写数据=%v\n", i)
		// time.Sleep(time.Second)
	}
	close(intChan)
}

//read data
func readData(intChan chan int, exitChan chan bool) {

	for {
		v, ok := <-intChan
		if !ok {
			break
		}
		// time.Sleep(time.Second)
		fmt.Printf("readData 读到数据=%v\n", v)
	}

	//任务完成
	exitChan <- true
	close(exitChan)
}

func main() {

	//创建两个管道
	intChan := make(chan int, 10)
	exitChan := make(chan bool, 1)

	go readData(intChan, exitChan)
	go writeData(intChan)

	// time.Sleep(time.Second * 10)

	for {
		_, ok := <-exitChan
		if !ok {
			break
		}
	}

}

```


再看一个例子:

![Alt text](https://raw.githubusercontent.com/Syncma/Figurebed/master/img/思路分析.png)

```go
package main

import (
    "fmt"
)

func putNum(intChan chan int) {
    for i := 1; i <= 80; i++ {
        intChan <- i
    }

    //关闭intChan
    close(intChan)

}

func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {

    var flag bool
    for {
        num, ok := <-intChan
        //intChan取不到
        if !ok {
            break
        }
        flag = true
        //判断是不是素数
        for i := 2; i < num; i++ {
            //说明num不是素数
            if num%i == 0 {
                flag = false
                break

            }
        }
        if flag {
            //放入primeChan
            primeChan <- num
        }
    }

    fmt.Println("有一个primeNum 协程因为取不到数据退出")
    //还不能关闭primeChan
    //向exitChan写入true
    exitChan <- true
}

func main() {

    intChan := make(chan int, 1000)
    primeChan := make(chan int, 2000) //放入结果
    exitChan := make(chan bool, 4)    //退出管道

    //开启一个协程,向intChan写入1-8000
    go putNum(intChan)

    //开启4个协程,从intChan取出数据,并判断是否为素数
    //如果是,就放入到primeChan
    for i := 0; i < 4; i++ {
        go primeNum(intChan, primeChan, exitChan)
    }

    //主线程处理
    go func() {
        for i := 0; i < 4; i++ {
            <-exitChan
        }

        //关闭primeChan
        close(primeChan)

    }()

    //遍历primeChan
    for {
        res, ok := <-primeChan
        if !ok {
            break
        }

        //结果输出
        fmt.Printf("素数=%d\n", res)

    }

    fmt.Println("main主线程退出")

}

```

运行结果:
```
有一个primeNum 协程因为取不到数据退出
有一个primeNum 协程因为取不到数据退出
有一个primeNum 协程因为取不到数据退出
有一个primeNum 协程因为取不到数据退出
素数=1
素数=2
素数=3
素数=5
素数=7
素数=11
素数=13
素数=17
素数=19
素数=23
素数=29
素数=31
素数=37
素数=41
素数=43
素数=47
素数=53
素数=59
素数=61
素数=67
素数=71
素数=73
素数=79
main主线程退出
```



这里有个问题,就是结果显示不对:

代码里面增加休眠时间

修改后:
```go
package main

import (
	"fmt"
	"time"
)

func putNum(intChan chan int) {
	for i := 1; i <= 80; i++ {
		intChan <- i
	}

	//关闭intChan
	close(intChan)

}

func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {

	var flag bool
	for {
		time.Sleep(time.Millisecond)
		num, ok := <-intChan
		//intChan取不到
		if !ok {
			break
		}
		flag = true
		//判断是不是素数
		for i := 2; i < num; i++ {
			//说明num不是素数
			if num%i == 0 {
				flag = false
				break

			}
		}
		if flag {
			//放入primeChan
			primeChan <- num
		}
	}

	fmt.Println("有一个primeNum 协程因为取不到数据退出")
	//还不能关闭primeChan
	//向exitChan写入true
	exitChan <- true
}

func main() {

	intChan := make(chan int, 1000)
	primeChan := make(chan int, 2000) //放入结果
	exitChan := make(chan bool, 4)    //退出管道

	//开启一个协程,向intChan写入1-8000
	go putNum(intChan)

	//开启4个协程,从intChan取出数据,并判断是否为素数
	//如果是,就放入到primeChan
	for i := 0; i < 4; i++ {
		go primeNum(intChan, primeChan, exitChan)
	}

	//主线程处理
	go func() {
		for i := 0; i < 4; i++ {
			<-exitChan
		}

		//关闭primeChan
		close(primeChan)

	}()

	//遍历primeChan
	for {
		res, ok := <-primeChan
		if !ok {
			break
		}

		//结果输出
		fmt.Printf("素数=%d\n", res)

	}

	fmt.Println("main主线程退出")

}

```


运行结果:
```
素数=1
素数=2
素数=3
素数=5
素数=7
素数=11
素数=13
素数=17
素数=19
素数=23
素数=29
素数=31
素数=37
素数=41
素数=43
素数=47
素数=53
素数=59
素数=61
素数=67
素数=71
素数=73
素数=79
有一个primeNum 协程因为取不到数据退出
有一个primeNum 协程因为取不到数据退出
有一个primeNum 协程因为取不到数据退出
有一个primeNum 协程因为取不到数据退出
main主线程退出
```

### 代码效率

1.普通方法

```go
package main

import (
	"fmt"
	"time"
)

func main() {

	start := time.Now().Unix()
	for num := 1; num <= 80000; num++ {

		flag := true
		//判断是不是素数
		for i := 2; i < num; i++ {
			//说明num不是素数
			if num%i == 0 {
				flag = false
				break

			}
		}
		if flag {

		}
	}
	end := time.Now().Unix()
	fmt.Println("普通方法耗时=", end-start) //普通方法耗时= 3

}
```


2.使用了协程+管道
```go
package main

import (
	"fmt"
	"time"
)

func putNum(intChan chan int) {
	for i := 1; i <= 80000; i++ {
		intChan <- i
	}

	//关闭intChan
	close(intChan)

}

func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {

	var flag bool
	for {
		// time.Sleep(time.Millisecond)
		num, ok := <-intChan
		//intChan取不到
		if !ok {
			break
		}
		flag = true
		//判断是不是素数
		for i := 2; i < num; i++ {
			//说明num不是素数
			if num%i == 0 {
				flag = false
				break

			}
		}
		if flag {
			//放入primeChan
			primeChan <- num
		}
	}

	fmt.Println("有一个primeNum 协程因为取不到数据退出")
	//还不能关闭primeChan
	//向exitChan写入true
	exitChan <- true
}

func main() {

	intChan := make(chan int, 1000)
	primeChan := make(chan int, 20000) //放入结果
	exitChan := make(chan bool, 4)     //退出管道

	start := time.Now().Unix()
	//开启一个协程,向intChan写入1-8000
	go putNum(intChan)

	//开启4个协程,从intChan取出数据,并判断是否为素数
	//如果是,就放入到primeChan
	for i := 0; i < 4; i++ {
		go primeNum(intChan, primeChan, exitChan)
	}

	//主线程处理
	go func() {
		for i := 0; i < 4; i++ {
			<-exitChan
		}

		end := time.Now().Unix()
		fmt.Println("使用协程耗时=", end-start) //使用协程耗时= 1

		//关闭primeChan
		close(primeChan)

	}()

	//遍历primeChan
	for {
		_, ok := <-primeChan
		// res, ok := <-primeChan
		if !ok {
			break
		}

		//结果输出
		// fmt.Printf("素数=%d\n", res)

	}

	fmt.Println("main主线程退出")

}

```


3.优化版

在运行某个程序时,如何指定是否存在资源竞争问题?

**方法很简单,`在编译程序时,增加一个参数 -race`**


## golang管道细节总结


### 细节1
```go
package main

import (
    "fmt"
)

func main() {
    //管道可以声明只读或者只写

    //1.在默认情况下,管道是双向
    //var chan1 chan int //可读可写

    //2 声明为只写
    var chan2 chan<- int
    chan2 = make(chan int, 3)
    chan2 <- 20
    // num := <-chan2 //error

    //3 声明为只读
    var chan3 <-chan int
    chan3 = make(chan int, 3)
    // chan3 <- 20//error
    num := <-chan3

    fmt.Println("chan2=", chan2)

}
```


### 细节2
```go
package main

import (
    "fmt"
)

func main() {
    //使用select 可以解决从管道取数据的阻塞问题

    //1.定义一个管道 10个数据int
    intChan := make(chan int, 10)
    for i := 0; i < 10; i++ {
        intChan <- i
    }

    //2.定义一个管道 5个数据string
    StringChan := make(chan string, 5)
    for i := 0; i < 5; i++ {
        StringChan <- "hello" + fmt.Sprintf("%d", i)
    }

    //传统方法在遍历管道时候 如果不关闭会阻塞会导致deadlock
    //问题在实际开发中可能我们不好确定什么时候关闭管道
    //可以使用select 方法解决
    // label:
    for {
        select {
        //注意:这里如果intChan一直没有关闭不会一直阻塞而deadlock
        //会自动到下一个case匹配
        case v := <-intChan:
            fmt.Printf("从intChan读取数据%d\n", v)
        case v := <-StringChan:
            fmt.Printf("从StringChan读取数据%s\n", v)
        default:
            fmt.Printf("都取不到\n")
            // break label //跟label配合使用
            return
        }

    }

}
```


### 细节3
```go
package main

import (
    "fmt"
    "time"
)

func sayHello() {
    for i := 0; i < 10; i++ {
        time.Sleep(time.Second)
        fmt.Println("hello world")
    }
}

func test() {

    //使用defer+recover
    defer func() {
        //捕获抛出的panic
        if err := recover(); err != nil {
            fmt.Println("test()发生错误", err)
        }

    }()
    var myMap map[int]string
    myMap[0] = "golang"
}

func main() {
    go sayHello()
    go test()

    for i := 0; i < 10; i++ {
        fmt.Println("main() ok=", i)
    }

}

```

================================================
FILE: content/articles/how_to_profile/how_to_profile.md
================================================
---
title: "HOW TO PROFILE"
date: 2019-01-24T15:09:31+08:00
draft: true
---

介绍使用Benchmark进行调优。

- 如何写压测示例;
- 如何使用压测程序进行调优;



原文及源码参考:

- [how to profile](https://github.com/xpzouying/learning_golang/tree/master/how_to_tuning)
- 交流加微信: `imzouying`

## 原始代码

代码功能:访客记次数。

具体程序参见上一篇[how to test](https://github.com/xpzouying/learning_golang/tree/master/how_to_test)

```go
package main

import (
	"fmt"
	"net/http"
	"sync"

	"github.com/sirupsen/logrus"
)

var counter = map[string]int{}
var mu sync.Mutex // mutex for counter

func handleHello(w http.ResponseWriter, r *http.Request) {
	name := r.FormValue("name")
	mu.Lock()
	defer mu.Unlock()
	counter[name]++

	w.Header().Set("Content-Type", "text/html; charset=utf-8")
	w.Write([]byte("<h1 style='color: " + r.FormValue("color") +
		"'>Welcome!</h1> <p>Name: " + name + "</p> <p>Count: " + fmt.Sprint(counter[name]) + "</p>"))

	logrus.WithFields(logrus.Fields{
		"module": "main",
		"name":   name,
		"count":  counter[name],
	}).Infof("visited")
}

func main() {
	logrus.SetFormatter(&logrus.JSONFormatter{})

	http.HandleFunc("/hello", handleHello)
	logrus.Fatal(http.ListenAndServe(":8080", nil))
}
```



上一次讲了如何进行普通的测试,这次对`handleHello`处理函数编写压力测试示例。

```go
func BenchmarkHandleFunc(b *testing.B) {
	logrus.SetOutput(ioutil.Discard)  // 抛弃日志

	rw := httptest.NewRecorder()
	req := httptest.NewRequest(http.MethodPost, "/hello?name=zouying", nil)

	for i := 0; i < b.N; i++ {
		handleHello(rw, req)
	}
}
```



运行压测用例:

```bash
➜  how_to_tuning git:(master) ✗ go test -bench .
goos: darwin
goarch: amd64
BenchmarkHandleFunc-8             300000              4116 ns/op
PASS
ok      _/Users/zouying/src/Github.com/ZOUYING/learning_golang/how_to_tuning    1.319s
```



或者增加`-benchmem`选项,显示内存信息,

```bash
➜  how_to_tuning git:(master) ✗ go test -bench . -benchmem
goos: darwin
goarch: amd64
BenchmarkHandleFunc-8             300000              4297 ns/op            1411 B/op         25 allocs/op
PASS
ok      _/Users/zouying/src/Github.com/ZOUYING/learning_golang/how_to_tuning    1.368s
```

或者在测试用例中的最开始,增加下列代码,也可以显示内存信息。

```go
b.ReportAllocs()
```

每个压测用例默认的压测时常大概在1秒钟,如果我们需要压测的时间长一些的话,那么可以在运行的时候,加上`-benchtime=5s`的参数,5s表示5秒。



## Golang调优

### 背景

- Robert Hundt在2011年Scala Day发表了一篇论文,论文叫:[Loop Recognition in C++/Java/Go/Scala](https://ai.google/research/pubs/pub37122),大概讲的就是论文中的Go程序运行的非常慢。

- Go团队就使用`go tool pprof`进行了优化,具体参见:[profiling-go-programs](https://blog.golang.org/profiling-go-programs)。结果为:

  - 速度巨大提升(*magnitude faster*)
  - 6倍的内存降低(*use 6x less memory*)

- 重现论文程序。在论文中虽然比对了四种语言,但由于go团队的人没有足够的Java和Scala的优化能力,所以只进行了Go和C++具体比对。

  > 具体的软件、硬件如下:
  >
  > ```bash
  > $ go version
  > go version devel +08d20469cc20 Tue Mar 26 08:27:18 2013 +0100 linux/amd64
  > $ g++ --version
  > g++ (GCC) 4.8.0
  > Copyright (C) 2013 Free Software Foundation, Inc.
  > ...
  > $
  > ```
  >
  > ```
  > 硬件:
  > 
  > 3.4GHz Core i7-2600 CPU and 16 GB of RAM running Gentoo Linux's 3.8.4-gentoo kernel
  > ```
  >
  > **调优前,重现论文程序的结果。**
  >
  > 具体结果:

  > ```bash
  > $ cat xtime
  > #!/bin/sh
  > /usr/bin/time -f '%Uu %Ss %er %MkB %C' "$@"
  > $
  > 
  > $ make havlak1cc
  > g++ -O3 -o havlak1cc havlak1.cc
  > $ ./xtime ./havlak1cc
  > # of loops: 76002 (total 3800100)
  > loop-0, nest: 0, depth: 0
  > 17.70u 0.05s 17.80r 715472kB ./havlak1cc
  > $
  > 
  > $ make havlak1
  > go build havlak1.go
  > $ ./xtime ./havlak1
  > # of loops: 76000 (including 1 artificial root node)
  > 25.05u 0.11s 25.20r 1334032kB ./havlak1
  > $
  > ```
  >
  > 输出参数为:`u: user time`, `s: system time`,`r: real time`
  >
  > C++程序运行了17.80s,使用内存700MB;
  >
  > Go程序是运行了25.20s,使用内存1302MB;

  - 最终优化版本

    > 运行2.29s,使用内存:351MB;提升了11倍;
    >
    > ```bash
    > $ make havlak6
    > go build havlak6.go
    > $ ./xtime ./havlak6
    > # of loops: 76000 (including 1 artificial root node)
    > 2.26u 0.02s 2.29r 360224kB ./havlak6
    > $
    > ```
    >
    > 

  - 按照Go相同的思路,实现了一遍C++相同的代码,具体代码参见:[C++版本代码](https://github.com/rsc/benchgraffiti/blob/master/havlak/havlak6.cc)

    > 耗时:2.19s,379MB内存;
    >
    > ```bash
    > $ make havlak6cc
    > g++ -O3 -o havlak6cc havlak6.cc
    > $ ./xtime ./havlak6cc
    > # of loops: 76000 (including 1 artificial root node)
    > 1.99u 0.19s 2.19r 387936kB ./havlak6cc
    > ```

  - 代码源码参考:

    - [c++](https://github.com/rsc/benchgraffiti/blob/master/havlak/havlak6.cc)
    - [go](https://github.com/rsc/benchgraffiti/blob/master/havlak/havlak6.go)



### Golang自带的调优库: pprof

- runtime/pprof:输出runtime的profiling数据,写到指定文件中,而该文件可以被一些pprof tool打开。

  - 使用benchmark

    > ```bash
    > # 输出cpu profile和memory profile
    > go test -cpuprofile cpu.prof -memprofile mem.prof -bench .
    > ```

  - 标准的程序

    > ```go
    > var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`")
    > var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
    > 
    > func main() {
    >  flag.Parse()
    >  if *cpuprofile != "" {
    >      f, err := os.Create(*cpuprofile)
    >      if err != nil {
    >          log.Fatal("could not create CPU profile: ", err)
    >      }
    >      if err := pprof.StartCPUProfile(f); err != nil {
    >          log.Fatal("could not start CPU profile: ", err)
    >      }
    >      defer pprof.StopCPUProfile()
    >  }
    > 
    >  // ... rest of the program ...
    > 
    >  if *memprofile != "" {
    >      f, err := os.Create(*memprofile)
    >      if err != nil {
    >          log.Fatal("could not create memory profile: ", err)
    >      }
    >      runtime.GC() // get up-to-date statistics
    >      if err := pprof.WriteHeapProfile(f); err != nil {
    >          log.Fatal("could not write memory profile: ", err)
    >      }
    >      f.Close()
    >  }
    > }
    > ```

- net/http/pprof:也可以通过HTTP server获取到runtime profiling data,一般如果是http服务的话,可以直接挂在到对应的http handler上,然后通过访问`/debug/pprof/`开头的路径,进行进行相应数据的访问。

  > ```go
  > import _ "net/http/pprof"
  > 
  > go func() {
  > 	log.Println(http.ListenAndServe("localhost:6060", nil))
  > }()
  > ```
  >
  > ```bash
  > # 查看heap profile
  > go tool pprof http://localhost:6060/debug/pprof/heap
  > 
  > # 查看30s CPU profile
  > go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
  > 
  > # 检查blocking profile,需要设置首先调用runtime.SetBlockProfileRate
  > go tool pprof http://localhost:6060/debug/pprof/block
  > 
  > # 收集5s的trace数据
  > wget http://localhost:6060/debug/pprof/trace?seconds=5
  > ```

- 打开收集到的profile

  - golang pprof tool

    ```bash
    go tool pprof cpu.prof
    ```

  - 第三方的pprof tool

    - uber火焰图,火焰图效果如下,

      > 使用火焰图打开profile,
      >
      > ```bash
      > ➜  how_to_tuning git:(master) ✗ go-torch /tmp/5_cpu.prof
      > INFO[23:12:40] Run pprof command: go tool pprof -raw -seconds 30 /tmp/5_cpu.prof
      > INFO[23:12:41] Writing svg to torch.svg
      > ```
      >
      > 
      >
      > 使用chrome浏览器打开`torch.svg`,
      >
      > ![火焰图](/static/images/how_to_profile_torch.svg)
      >
      > 
      >
      > 生成内存火焰图,
      >
      > ```bash
      > ➜  how_to_tuning git:(master) ✗ go-torch --alloc_objects /tmp/5_mem.prof
      > INFO[23:17:53] Run pprof command: go tool pprof -raw -seconds 30 --alloc_objects /tmp/5_mem.prof
      > INFO[23:17:54] Writing svg to torch.svg
      > ```
      >
      > 
      >
      > 打开内存火焰图,
      >
      > ![内存火焰图](/static/images/mem_torch.svg)



如何使用工具:

- topN:默认显示flat Top 10的函数,可以加`-cum`统计总的消耗;
- list Func:显示函数每行代码的采样分析;
- web:生成svg热点图片
- weblist:生成svg list代码采样分析;



## CPU调优

原理:

每秒钟100次的数据状态采样,根据经验值,默认100Hz比较合理,一般不能大于500Hz。既能产生足够有效的数据,也不至于让系统产生卡顿。

相关的定义在[StartCPUProfile()](https://golang.org/src/runtime/pprof/pprof.go#L740)

```go
func StartCPUProfile(w io.Writer) error {
	// The runtime routines allow a variable profiling rate,
	// but in practice operating systems cannot trigger signals
	// at more than about 500 Hz, and our processing of the
	// signal is not cheap (mostly getting the stack trace).
	// 100 Hz
Download .txt
gitextract_sif4occr/

├── .all-contributorsrc
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── share_request.md
│   │   └── share_template.md
│   ├── dependabot.yml
│   ├── weekly-digest.yml
│   └── workflows/
│       ├── links.yml
│       └── monthly.yml
├── .gitignore
├── .markdownlint.json
├── .netlify/
│   └── state.json
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── HISTORY.md
├── JOINUS.md
├── LICENSE
├── Makefile
├── README.md
├── SHARE_REQUEST_PROPOSAL.md
├── actions/
│   ├── go.mod
│   ├── issuesinfo.json
│   └── monthly.go
├── archetypes/
│   └── default.md
├── config.toml
├── content/
│   ├── _index.md
│   ├── algorithms/
│   │   ├── 2020-12-27.md
│   │   ├── 2020-12-28.md
│   │   ├── 2020-12-29.md
│   │   ├── 2020-12-30.md
│   │   ├── 2021-01-01.md
│   │   ├── 2021-01-03.md
│   │   ├── 2021-01-06.md
│   │   ├── 2021-01-08.md
│   │   ├── 2021-01-09.md
│   │   ├── 2021-01-11.md
│   │   └── 2021-01-12.md
│   ├── articles/
│   │   ├── 2018-05-31-batch-del-redis-key.md
│   │   ├── 2018-11-11-golang-file-lock.md
│   │   ├── 2019-11-07-Raft--易于理解的一致性算法.md
│   │   ├── 2020-02-08-source_go_flag.md
│   │   ├── _index.md
│   │   ├── goroutine_and_channel/
│   │   │   └── README.md
│   │   ├── how_to_profile/
│   │   │   └── how_to_profile.md
│   │   ├── how_to_test/
│   │   │   └── README.md
│   │   ├── sonarqube-for-golang/
│   │   │   ├── 2018-07-22-sonarqube-for-golang.md
│   │   │   ├── Dockerfile
│   │   │   ├── index.md
│   │   │   └── run.sh
│   │   ├── sony-gobreaker/
│   │   │   └── README.md
│   │   └── sync/
│   │       ├── README.md
│   │       ├── sync_Map_source_code_analysis.md
│   │       ├── sync_cond_source_code_analysis.md
│   │       ├── sync_mutex_source_code_analysis.md
│   │       ├── sync_once_source_code_analysis.md
│   │       ├── sync_rwmutex_source_code_analysis.md
│   │       └── sync_waitgroup_source_code_analysis.md
│   ├── discuss/
│   │   ├── 2018-05-08-anlayze-underscore-in-go.md
│   │   ├── 2018-05-09-wechat-discuss.md
│   │   ├── 2018-05-10-which-vendor-tool.md
│   │   ├── 2018-05-13-declaring-variables-on-if-else.md
│   │   ├── 2018-05-16-the-way-to-go.md
│   │   ├── 2018-05-18-bitset-and-import-cycle-not-allowed.md
│   │   ├── 2018-05-21-using-goroutines-on-loop-iterator-variables.md
│   │   ├── 2018-05-22-go-string-to-byte-slice.md
│   │   ├── 2018-05-23-wechat-discuss.md
│   │   ├── 2018-05-28-pprof-in-go.md
│   │   ├── 2018-06-07-dial-timeout-in-go.md
│   │   ├── 2018-07-02-c1000k-on-linux.md
│   │   ├── 2018-07-04-package-names.md
│   │   ├── 2018-07-09-make-new-in-go.md
│   │   ├── 2018-07-11-using_64bit_atomic_in_32bit_system.md
│   │   ├── 2018-07-14-version-gopath-go-command.md
│   │   ├── 2018-07-31-println-Println-and_context.md
│   │   ├── 2018-08-02-apns-push-notification.md
│   │   ├── 2018-08-02-go-shell.md
│   │   ├── 2018-08-09-log-color-in-go.md
│   │   ├── 2018-08-14-wechat-discuss.md
│   │   ├── 2018-08-15-wechat-discuss.md
│   │   ├── 2018-08-23-wechat-discuss.md
│   │   ├── 2018-08-24-wechat-discuss.md
│   │   ├── 2018-08-30-understanding-go-interfaces.md
│   │   ├── 2018-09-04-wechat-discuss.md
│   │   ├── 2018-09-05-git-system.md
│   │   ├── 2018-09-14-tips-in-vscode.md
│   │   ├── 2018-09-18-benchmark-tools.md
│   │   ├── 2018-09-19-wechat-discuss.md
│   │   ├── 2018-09-28-return-value-in-waitgroup.md
│   │   ├── 2018-10-18-encOp.md
│   │   ├── 2018-11-08-address_operators.md
│   │   ├── 2018-11-08-aws-ec2-ssh-login-problem.md
│   │   ├── 2018-11-09-force-to-use-keyed-struct-literals.md
│   │   ├── 2018-11-29-config-in-go.md
│   │   ├── 2018-12-04-change-to-go.md
│   │   ├── 2018-12-04-wechat-discuss.md
│   │   ├── 2018-12-07-wechat-discuss.md
│   │   ├── 2018-12-11-wechat-discuss.md
│   │   ├── 2018-12-25-macOS-time-synchronization.md
│   │   ├── 2019-01-10-anlayze-range.md
│   │   ├── 2019-02-20-bigdecimal-show-string.md
│   │   ├── 2019-03-07-wechat-discuss.md
│   │   ├── 2019-03-08-wechat-discuss.md
│   │   ├── 2019-03-26-gopsutil.md
│   │   ├── 2019-04-10-remove-local-branch-in-merged-master.md
│   │   ├── 2019-05-15-jaeger.md
│   │   ├── 2019-05-21-chromedp.md
│   │   ├── 2019-06-19-gorm-mysql-timestamp.md
│   │   ├── 2019-07-16-assign-and-range.md
│   │   ├── 2019-07-17-global-variable-init.md
│   │   ├── 2019-10-13-go-module-looping-package.md
│   │   ├── _index.md
│   │   └── log_color_test.go
│   ├── harvest/
│   │   ├── _index.md
│   │   └── harvest.md
│   ├── home.md
│   ├── interview/
│   │   ├── _index.md
│   │   ├── articles/
│   │   │   ├── interview_analysis_1.md
│   │   │   ├── interview_analysis_2.md
│   │   │   ├── interview_analysis_3.md
│   │   │   └── interview_analysis_4.md
│   │   ├── interview-algorithm.md
│   │   ├── interview-architecture.md
│   │   ├── interview-data-structure.md
│   │   ├── interview-database.md
│   │   ├── interview-design.md
│   │   ├── interview-golang-language.md
│   │   ├── interview-network.md
│   │   ├── interview-os.md
│   │   └── interview-pen.md
│   ├── night/
│   │   ├── 1-2018-03-21-goutil.md
│   │   ├── 1-2019-03-14-daily-reading.md
│   │   ├── 10-2018-06-28-net-http-part4.md
│   │   ├── 104-2020-09-13-hashicorp-raft.md
│   │   ├── 105-2020-10-03-go-zero-discuss.md
│   │   ├── 11-2018-07-26-golang-jenkins-sonarqube.md
│   │   ├── 12-2018-08-02-goroutine-GPM.md
│   │   ├── 13-2018-08-09-kubernetes-guide.md
│   │   ├── 14-2018-08-17-sync-pool-reading.md
│   │   ├── 15-2018-08-23-pool-workshop-in-go.md
│   │   ├── 16-2018-09-06-gateway-reading.md
│   │   ├── 17-2018-09-20-grpcp.md
│   │   ├── 18-2018-09-27-CovenantSQL-DH-RPC.md
│   │   ├── 19-2018-11-08-http-router-in-go.md
│   │   ├── 2-2018-04-11-teleport.md
│   │   ├── 20-2018-11-15-go-test.md
│   │   ├── 21-2018-11-28-errors-in-go.md
│   │   ├── 22-2018-12-06-go-ide-discuss.md
│   │   ├── 23-2018-12-13-drone-guide.md
│   │   ├── 24-2018-12-23-go-mod-part-1.md
│   │   ├── 25-2018-12-27-tsdb.md
│   │   ├── 26-2019-01-03-blog-with-github-netlify.md
│   │   ├── 27-2019-01-10-go-mod-part-2.md
│   │   ├── 28-2019-01-17-go-mod-part-3.md
│   │   ├── 29-2019-01-23-opentracing-jaeger-in-go.md
│   │   ├── 3-2018-04-18-strings-part1.md
│   │   ├── 30-2019-02-16-go-mod-part-4.md
│   │   ├── 31-2019-02-23-flag.md
│   │   ├── 32-2019-03-02-etcd-raft.md
│   │   ├── 33-2019-03-07-defer-in-go.md
│   │   ├── 34-2019-03-16-plan9-guide.md
│   │   ├── 35-2019-03-21-reading-context.md
│   │   ├── 36-2019-03-28-reading-k8s-context.md
│   │   ├── 37-2019-04-01-talk-from-serverless-in-apache-pulsar.md
│   │   ├── 38-2019-04-13-k8s-scheduler-reading.md
│   │   ├── 39-2019-04-18-init-function-in-go.md
│   │   ├── 4-2018-04-25-strings-part2.md
│   │   ├── 40-2019-04-27-atomic-value-in-go.md
│   │   ├── 41-2019-05-12-golint-golangci-lint.md
│   │   ├── 42-2019-05-16-go-failpoint-design.md
│   │   ├── 43-2019-05-23-gomonkey-framework-design-and-practives.md
│   │   ├── 44-2019-05-29-go-map-reading.md
│   │   ├── 45-2019-05-30-goim-reading.md
│   │   ├── 46-2019-06-05-tidb-overview-reading.md
│   │   ├── 47-2019-06-12-tidb-exector-reading.md
│   │   ├── 48-2019-06-19-tidb-compiler-reading.md
│   │   ├── 49-2019-06-26-tidb-transaction-reading.md
│   │   ├── 5-2018-05-10-strings-part3.md
│   │   ├── 50-2019-06-27-goland-practice.md
│   │   ├── 51-2019-07-18-sync-errgroup.md
│   │   ├── 52-2019-07-25-httprouter-guide.md
│   │   ├── 53-2019-08-01-build-in-delete-from-map-in-go.md
│   │   ├── 54-2019-08-14-tidb-sql-tools.md
│   │   ├── 55-2019-08-15-go-webassembly-guide.md
│   │   ├── 56-2019-08-22-channel-select-in-go.md
│   │   ├── 57-2019-08-29-sync-semaphore.md
│   │   ├── 58-2019-09-05-whats-new-in-go1.13.md
│   │   ├── 59-2019-09-12-real-world-go-concurrency-bugs-in-paper-reading.md
│   │   ├── 6-2018-05-17-strings-part4.md
│   │   ├── 60-2019-09-19-ipfs-guide.md
│   │   ├── 61-2019-09-26-go-module-goproxy-cn.md
│   │   ├── 62-2019-10-10-go-micro-part1.md
│   │   ├── 63-2019-10-17-go-style-and-go-advices.md
│   │   ├── 64-2019-10-24-go-runtime.md
│   │   ├── 65-2019-10-31-go-net.md
│   │   ├── 66-2019-11-07-paper-reading-csp.md
│   │   ├── 67-2019-11-14-sql-pool-reading.md
│   │   ├── 68-2019-11-21-dive-into-network.md
│   │   ├── 69-2019-11-28-devops.md
│   │   ├── 7-2018-05-24-net-http-part1.md
│   │   ├── 70-2019-12-05-go-details.md
│   │   ├── 71-2019-12-12-go-ini.md
│   │   ├── 72-2019-12-19-go-micro-2.md
│   │   ├── 73-2019-12-28-qrpc.md
│   │   ├── 74-2020-01-02-time-in-go-1-14.md
│   │   ├── 75-2020-02-06-the-state-of-go-in-2020.md
│   │   ├── 76-2020-02-20-kubernetes-scheduler-design.md
│   │   ├── 77-2020-03-05-reading-go-earnings.md
│   │   ├── 78-2020-03-11-go-scheduler-reading.md
│   │   ├── 79-2020-03-12-go-micro-tools.md
│   │   ├── 8-2018-05-31-net-http-part2.md
│   │   ├── 80-2020-03-18-go2-generics.md
│   │   ├── 81-2020-03-19-gorm-guide.md
│   │   ├── 82-2020-03-21-talkgo-night-story.md
│   │   ├── 83-2020-03-26-gobench.md
│   │   ├── 84-2020-04-02-go-aligned.md
│   │   ├── 85-2020-04-16-douyu-confgo.md
│   │   ├── 86-2020-04-23-go-unsafe-pointer.md
│   │   ├── 87-2020-04-29-goland-tips.md
│   │   ├── 9-2018-06-14-net-http-part3.md
│   │   ├── _index.md
│   │   └── other/
│   │       ├── 16-2018-09-06-faas-provider.md
│   │       ├── 16-2018-09-06-openfaas-guide.md
│   │       ├── 16-2018-09-06-queue-worker.md
│   │       ├── 16-2018-09-06-quick-start.md
│   │       ├── 16-2018-09-06-watchdog.md
│   │       ├── 2-2018-04-11_voice.md
│   │       ├── sync-pool-demo/
│   │       │   ├── cmd/
│   │       │   │   └── makeslice.go
│   │       │   ├── demo/
│   │       │   │   └── main.go
│   │       │   ├── demo2/
│   │       │   │   └── main.go
│   │       │   └── main.go
│   │       └── zap-learn/
│   │           ├── go.mod
│   │           ├── go.sum
│   │           ├── logger/
│   │           │   ├── logger.go
│   │           │   ├── logger_test.go
│   │           │   └── zap/
│   │           │       └── zap.go
│   │           └── main.go
│   ├── other/
│   │   ├── _index.md
│   │   ├── awesome-tools-mac.md
│   │   ├── dev-tools-vimrc.md
│   │   └── goland-help.md
│   └── proposal/
│       ├── _index.md
│       └── changes-to-go.md
├── examples/
│   ├── README.md
│   └── gin_examples/
│       ├── .gitignore
│       ├── .gitkeep
│       ├── ENDPOINTS.md
│       ├── Makefile
│       ├── README.md
│       ├── cmd/
│       │   └── server/
│       │       └── main.go
│       ├── docker-compose-dev.yml
│       ├── go.mod
│       ├── go.sum
│       ├── pkg/
│       │   ├── auth/
│       │   │   ├── auth.go
│       │   │   ├── auth_test.go
│       │   │   ├── sessionId.go
│       │   │   └── sessionId_test.go
│       │   ├── config/
│       │   │   ├── config.go
│       │   │   └── config_test.go
│       │   ├── http/
│       │   │   ├── middleware.go
│       │   │   ├── middleware_test.go
│       │   │   ├── routes.go
│       │   │   ├── server.go
│       │   │   ├── userHandler.go
│       │   │   └── userHandler_test.go
│       │   ├── mock/
│       │   │   ├── repository.go
│       │   │   └── service.go
│       │   ├── postgres/
│       │   │   ├── postgres.go
│       │   │   └── userrepository.go
│       │   └── service/
│       │       └── userservice/
│       │           ├── userservice.go
│       │           └── userservice_test.go
│       └── user.go
├── gen_contributors.sh
├── go.mod
├── go.sum
├── layouts/
│   ├── _default/
│   │   ├── index.json
│   │   └── list.html
│   └── shortcodes/
│       └── badges.html
├── macos-terminal-proxy-set.md
├── package.json
├── practice/
│   └── reading-go-43/
│       ├── README.md
│       └── main.go
├── static/
│   ├── icons/
│   │   ├── Read Me.txt
│   │   ├── demo-files/
│   │   │   ├── demo.css
│   │   │   └── demo.js
│   │   ├── demo.html
│   │   ├── selection.json
│   │   └── style.css
│   └── javascripts/
│       └── application.js
├── talkgo.go
├── talkgo_test.go
└── themes/
    └── hugo-material-docs/
        ├── CHANGELOG.md
        ├── LICENSE.md
        ├── README.md
        ├── archetypes/
        │   └── default.md
        ├── exampleSite/
        │   ├── config.toml
        │   ├── content/
        │   │   ├── adding-content/
        │   │   │   └── index.md
        │   │   ├── getting-started/
        │   │   │   └── index.md
        │   │   ├── index.md
        │   │   ├── license/
        │   │   │   └── index.md
        │   │   └── roadmap/
        │   │       └── index.md
        │   └── static/
        │       └── .gitkeep
        ├── layouts/
        │   ├── 404.html
        │   ├── _default/
        │   │   ├── __list.html
        │   │   └── single.html
        │   ├── index.html
        │   ├── partials/
        │   │   ├── comment.html
        │   │   ├── drawer.html
        │   │   ├── drawer_list.html
        │   │   ├── footer.html
        │   │   ├── footer_js.html
        │   │   ├── head.html
        │   │   ├── header.html
        │   │   ├── nav.html
        │   │   └── nav_link.html
        │   └── shortcodes/
        │       ├── note.html
        │       └── warning.html
        ├── static/
        │   ├── javascripts/
        │   │   ├── application.js
        │   │   ├── growingio.js
        │   │   └── modernizr.js
        │   └── stylesheets/
        │       ├── application.css
        │       ├── palettes.css
        │       └── temporary.css
        └── theme.toml
Download .txt
SYMBOL INDEX (193 symbols across 37 files)

FILE: actions/monthly.go
  type Issue (line 15) | type Issue struct
  function main (line 22) | func main() {
  function closeOldIssues (line 80) | func closeOldIssues(client *github.Client, owner, repo string, name stri...

FILE: content/discuss/log_color_test.go
  function TestLogColor (line 9) | func TestLogColor(t *testing.T) {

FILE: content/night/other/sync-pool-demo/cmd/makeslice.go
  function main (line 5) | func main() {

FILE: content/night/other/sync-pool-demo/demo/main.go
  function readContent (line 20) | func readContent(wg *sync.WaitGroup) {
  function main (line 42) | func main() {

FILE: content/night/other/sync-pool-demo/demo2/main.go
  function readContent (line 23) | func readContent(wg *sync.WaitGroup) {
  function main (line 56) | func main() {

FILE: content/night/other/sync-pool-demo/main.go
  function main (line 9) | func main() {

FILE: content/night/other/zap-learn/logger/logger.go
  type Logger (line 7) | type Logger interface
  function Setup (line 42) | func Setup() error {
  function TearDown (line 48) | func TearDown() {
  function FDebug (line 52) | func FDebug(prefix string, keyAndValues ...string) {
  function FInfo (line 57) | func FInfo(prefix string, keyAndValues ...string) {
  function FWarn (line 62) | func FWarn(prefix string, keyAndValues ...string) {
  function FError (line 67) | func FError(prefix string, keyAndValues ...string) {
  function FPanic (line 72) | func FPanic(prefix string, keyAndValues ...string) {
  function Debug (line 78) | func Debug(args ...interface{}) {
  function Info (line 83) | func Info(args ...interface{}) {
  function Warn (line 88) | func Warn(args ...interface{}) {
  function Error (line 93) | func Error(args ...interface{}) {
  function Panic (line 98) | func Panic(args ...interface{}) {
  function Debugf (line 103) | func Debugf(fmt string, args ...interface{}) {
  function Infof (line 108) | func Infof(fmt string, args ...interface{}) {
  function Warnf (line 113) | func Warnf(fmt string, args ...interface{}) {
  function Errorf (line 118) | func Errorf(fmt string, args ...interface{}) {
  function Panicf (line 123) | func Panicf(fmt string, args ...interface{}) {

FILE: content/night/other/zap-learn/logger/logger_test.go
  function TestFinfo (line 7) | func TestFinfo(t *testing.T) {
  function init (line 11) | func init() {

FILE: content/night/other/zap-learn/logger/zap/zap.go
  type ZLogger (line 16) | type ZLogger struct
    method Debug (line 24) | func (logger ZLogger) Debug(args ...interface{}) {
    method Info (line 29) | func (logger ZLogger) Info(args ...interface{}) {
    method Warn (line 34) | func (logger ZLogger) Warn(args ...interface{}) {
    method Error (line 39) | func (logger ZLogger) Error(args ...interface{}) {
    method Panic (line 44) | func (logger ZLogger) Panic(args ...interface{}) {
    method DPanic (line 51) | func (logger ZLogger) DPanic(template string, args ...interface{}) {
    method Fdebug (line 55) | func (logger ZLogger) Fdebug(msg string, keyAndValues ...string) {
    method Finfo (line 63) | func (logger ZLogger) Finfo(msg string, keyAndValues ...string) {
    method Fwarn (line 71) | func (logger ZLogger) Fwarn(msg string, keyAndValues ...string) {
    method Ferror (line 79) | func (logger ZLogger) Ferror(msg string, keyAndValues ...string) {
    method Fpanic (line 87) | func (logger ZLogger) Fpanic(msg string, keyAndValues ...string) {
    method Debugf (line 113) | func (logger ZLogger) Debugf(template string, args ...interface{}) {
    method Infof (line 118) | func (logger ZLogger) Infof(template string, args ...interface{}) {
    method Warnf (line 123) | func (logger ZLogger) Warnf(template string, args ...interface{}) {
    method Errorf (line 128) | func (logger ZLogger) Errorf(template string, args ...interface{}) {
    method Panicf (line 133) | func (logger ZLogger) Panicf(template string, args ...interface{}) {
    method DPanicf (line 141) | func (logger ZLogger) DPanicf(template string, args ...interface{}) {
    method TearDown (line 149) | func (logger ZLogger) TearDown() {
    method Level (line 153) | func (logger ZLogger) Level() int32 {
    method SetLevel (line 166) | func (logger ZLogger) SetLevel(level int32) {
    method ShowSQL (line 170) | func (logger ZLogger) ShowSQL(show ...bool) {
    method IsShowSQL (line 179) | func (logger ZLogger) IsShowSQL() bool {
  function parseFields (line 99) | func parseFields(keyAndValues ...string) []zap.Field {
  function NewLogger (line 183) | func NewLogger() *ZLogger {
  function callerEncoder (line 270) | func callerEncoder(caller zapcore.EntryCaller, enc zapcore.PrimitiveArra...
  function timeEncoder (line 275) | func timeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
  function milliSecondsDurationEncoder (line 280) | func milliSecondsDurationEncoder(d time.Duration, enc zapcore.PrimitiveA...
  function newLoggerConfig (line 284) | func newLoggerConfig(debugLevel bool, te zapcore.TimeEncoder, de zapcore...
  function NewLoggerWithLevel (line 304) | func NewLoggerWithLevel(debugLevel bool) (logger *zap.Logger) {
  function NewCustomLogger (line 314) | func NewCustomLogger(debugLevel bool, te zapcore.TimeEncoder, de zapcore...
  function NewNoCallerLogger (line 324) | func NewNoCallerLogger(debugLevel bool) (noCallerLogger *zap.Logger) {
  function NewNormalLoggers (line 335) | func NewNormalLoggers(debugLevel bool) (logger, noCallerLogger *zap.Logg...
  type logWriter (line 349) | type logWriter struct
    method Write (line 354) | func (w logWriter) Write(p []byte) (n int, err error) {

FILE: content/night/other/zap-learn/main.go
  function main (line 7) | func main() {

FILE: examples/gin_examples/cmd/server/main.go
  function main (line 13) | func main() {

FILE: examples/gin_examples/pkg/auth/auth.go
  type Authenticator (line 5) | type Authenticator struct
    method Hash (line 7) | func (a *Authenticator) Hash(password string) (string, error) {
    method CompareHash (line 17) | func (a *Authenticator) CompareHash(hashedPassword string, plainPasswo...

FILE: examples/gin_examples/pkg/auth/auth_test.go
  function TestAuthenticationProvider_HashAndSalt (line 10) | func TestAuthenticationProvider_HashAndSalt(t *testing.T) {
  function TestAuthenticator_CompareWithHash (line 34) | func TestAuthenticator_CompareWithHash(t *testing.T) {

FILE: examples/gin_examples/pkg/auth/sessionId.go
  method SessionID (line 9) | func (Authenticator) SessionID() string {

FILE: examples/gin_examples/pkg/auth/sessionId_test.go
  function TestAuthenticator_SessionID (line 10) | func TestAuthenticator_SessionID(t *testing.T) {

FILE: examples/gin_examples/pkg/config/config.go
  type Config (line 8) | type Config struct
    method IsProd (line 19) | func (c Config) IsProd() bool {
  function GetConfig (line 24) | func GetConfig() Config {

FILE: examples/gin_examples/pkg/config/config_test.go
  function TestGetConfig (line 10) | func TestGetConfig(t *testing.T) {

FILE: examples/gin_examples/pkg/http/middleware.go
  function NewAuthMiddleware (line 11) | func NewAuthMiddleware(provider ginexamples.UserAuthenticationProvider) ...
  function CORS (line 30) | func CORS() gin.HandlerFunc {
  function Logger (line 46) | func Logger(l *log.Logger) gin.HandlerFunc {

FILE: examples/gin_examples/pkg/http/middleware_test.go
  function TestNewAuthMiddleware (line 17) | func TestNewAuthMiddleware(t *testing.T) {
  function TestLogger (line 71) | func TestLogger(t *testing.T) {
  function TestCORS (line 109) | func TestCORS(t *testing.T) {

FILE: examples/gin_examples/pkg/http/routes.go
  method privateRoutes (line 7) | func (a *AppServer) privateRoutes(router *gin.RouterGroup) {
  method publicRoutes (line 12) | func (a *AppServer) publicRoutes(router *gin.RouterGroup) {

FILE: examples/gin_examples/pkg/http/server.go
  type AppServer (line 11) | type AppServer struct
    method initialize (line 17) | func (a *AppServer) initialize() {
    method Run (line 29) | func (a *AppServer) Run() {

FILE: examples/gin_examples/pkg/http/userHandler.go
  method RegisterUserHandler (line 11) | func (a *AppServer) RegisterUserHandler(c *gin.Context) {
  method LoginUserHandler (line 47) | func (a *AppServer) LoginUserHandler(c *gin.Context) {
  method LogoutUserHandler (line 78) | func (a *AppServer) LogoutUserHandler(c *gin.Context) {
  method GetUserHandler (line 96) | func (a *AppServer) GetUserHandler(c *gin.Context) {
  method GetMeHandler (line 116) | func (a *AppServer) GetMeHandler(c *gin.Context) {
  function setCookie (line 136) | func setCookie(c *gin.Context, value string) {

FILE: examples/gin_examples/pkg/http/userHandler_test.go
  function TestAppServer_RegisterUserHandler (line 10) | func TestAppServer_RegisterUserHandler(t *testing.T) {
  function TestAppServer_LoginUserHandler (line 63) | func TestAppServer_LoginUserHandler(t *testing.T) {
  function TestAppServer_LogoutUserHandler (line 114) | func TestAppServer_LogoutUserHandler(t *testing.T) {
  function TestAppServer_GetUserHandler (line 164) | func TestAppServer_GetUserHandler(t *testing.T) {
  function TestAppServer_GetMeHandler (line 211) | func TestAppServer_GetMeHandler(t *testing.T) {

FILE: examples/gin_examples/pkg/mock/repository.go
  type UserRepository (line 5) | type UserRepository struct
    method Store (line 22) | func (uRM *UserRepository) Store(user *ginexamples.User) error {
    method Update (line 27) | func (uRM *UserRepository) Update(user *ginexamples.User) error {
    method Find (line 32) | func (uRM *UserRepository) Find(id string) (*ginexamples.User, error) {
    method FindByEmail (line 37) | func (uRM *UserRepository) FindByEmail(email string) (*ginexamples.Use...
    method FindBySessionID (line 42) | func (uRM *UserRepository) FindBySessionID(sessionID string) (*ginexam...

FILE: examples/gin_examples/pkg/mock/service.go
  type UserService (line 5) | type UserService struct
    method CreateUser (line 15) | func (uSM *UserService) CreateUser(u *ginexamples.User, password strin...
    method GetUser (line 20) | func (uSM *UserService) GetUser(id string) (*ginexamples.User, error) {
  type UserAuthenticationProvider (line 25) | type UserAuthenticationProvider struct
    method Login (line 36) | func (uAM *UserAuthenticationProvider) Login(email string, password st...
    method Logout (line 41) | func (uAM *UserAuthenticationProvider) Logout(sessionID string) error {
    method CheckAuthentication (line 45) | func (uAM *UserAuthenticationProvider) CheckAuthentication(sessionID s...
  type Authenticator (line 50) | type Authenticator interface
  type AuthenticatorMock (line 56) | type AuthenticatorMock struct
    method Hash (line 67) | func (uAM *AuthenticatorMock) Hash(password string) (string, error) {
    method CompareHash (line 72) | func (uAM *AuthenticatorMock) CompareHash(hashedPassword string, plain...
    method SessionID (line 76) | func (uAM *AuthenticatorMock) SessionID() string {

FILE: examples/gin_examples/pkg/postgres/postgres.go
  type DBConfig (line 12) | type DBConfig struct
    method connectionInfo (line 20) | func (c DBConfig) connectionInfo() string {
  type Repository (line 31) | type Repository struct
    method AutoMigrate (line 50) | func (r *Repository) AutoMigrate() error {
  function Initialize (line 37) | func Initialize(c DBConfig) *Repository {

FILE: examples/gin_examples/pkg/postgres/userrepository.go
  type UserRepository (line 11) | type UserRepository struct
    method Store (line 22) | func (u *UserRepository) Store(user *ginexamples.User) error {
    method Find (line 26) | func (u *UserRepository) Find(id string) (*ginexamples.User, error) {
    method FindByEmail (line 38) | func (u *UserRepository) FindByEmail(email string) (*ginexamples.User,...
    method FindBySessionID (line 45) | func (u *UserRepository) FindBySessionID(sessionID string) (*ginexampl...
    method findBy (line 52) | func (u *UserRepository) findBy(key string, value string) (*ginexample...
    method Update (line 69) | func (u *UserRepository) Update(user *ginexamples.User) error {
  function newUserRepository (line 15) | func newUserRepository(db *gorm.DB) *UserRepository {
  function first (line 61) | func first(db *gorm.DB, dst interface{}) error {

FILE: examples/gin_examples/pkg/service/userservice/userservice.go
  type UserService (line 10) | type UserService struct
    method CreateUser (line 29) | func (uS *UserService) CreateUser(user *ginexamples.User, password str...
    method Login (line 54) | func (uS *UserService) Login(email string, password string) (*ginexamp...
    method Logout (line 74) | func (uS *UserService) Logout(sessionID string) error {
    method CheckAuthentication (line 86) | func (uS *UserService) CheckAuthentication(sessionID string) (*ginexam...
    method GetUser (line 95) | func (uS *UserService) GetUser(id string) (*ginexamples.User, error) {
  type Authenticator (line 15) | type Authenticator interface
  function New (line 22) | func New(userRepository ginexamples.UserRepository) *UserService {

FILE: examples/gin_examples/pkg/service/userservice/userservice_test.go
  function TestNew (line 70) | func TestNew(t *testing.T) {
  function TestUserService_CreateUser (line 77) | func TestUserService_CreateUser(t *testing.T) {
  function TestUserService_Login (line 118) | func TestUserService_Login(t *testing.T) {
  function TestUserService_Logout (line 153) | func TestUserService_Logout(t *testing.T) {
  function TestUserService_CheckAuthentication (line 181) | func TestUserService_CheckAuthentication(t *testing.T) {
  function TestUserService_GetUser (line 208) | func TestUserService_GetUser(t *testing.T) {

FILE: examples/gin_examples/user.go
  type User (line 7) | type User struct
  type UserRepository (line 16) | type UserRepository interface
  type UserService (line 24) | type UserService interface
  type UserAuthenticationProvider (line 30) | type UserAuthenticationProvider interface

FILE: practice/reading-go-43/main.go
  type Person (line 9) | type Person struct
    method Name (line 13) | func (p Person)Name()string  {
  function changeName (line 16) | func changeName(p *Person, v string) {
  function main (line 24) | func main(){

FILE: static/icons/demo-files/demo.js
  function updateTest (line 17) | function updateTest() {
  function updateSize (line 23) | function updateSize() {

FILE: static/javascripts/application.js
  function pegasus (line 1) | function pegasus(t, e) {
  function t (line 108) | function t(e, o) {

FILE: talkgo.go
  function BecomeAContributor (line 8) | func BecomeAContributor(username string) bool {

FILE: talkgo_test.go
  function TestBecomeAContributor (line 10) | func TestBecomeAContributor(t *testing.T) {

FILE: themes/hugo-material-docs/static/javascripts/application.js
  function pegasus (line 1) | function pegasus(t,e){return e=new XMLHttpRequest,e.open("GET",t),t=[],e...
  function t (line 1) | function t(e,o){function i(t,e){return function(){return t.apply(e,argum...

FILE: themes/hugo-material-docs/static/javascripts/modernizr.js
  function r (line 1) | function r(e,t){return typeof e===t}
  function i (line 1) | function i(){var e,t,n,i,o,a,s;for(var l in x)if(x.hasOwnProperty(l)){if...
  function o (line 1) | function o(e){var t=C.className,n=S._config.classPrefix||"";if(T&&(t=t.b...
  function a (line 1) | function a(e,t){if("object"==typeof e)for(var n in e)b(e,n)&&a(n,e[n]);e...
  function s (line 1) | function s(e,t){return function(){return e.apply(t,arguments)}}
  function l (line 1) | function l(e,t){return!!~(""+e).indexOf(t)}
  function u (line 1) | function u(){return"function"!=typeof t.createElement?t.createElement(ar...
  function c (line 1) | function c(){var e=t.body;return e||(e=u(T?"svg":"body"),e.fake=!0),e}
  function f (line 1) | function f(e,n,r,i){var o,a,s,l,f="modernizr",d=u("div"),p=c();if(parseI...
  function d (line 1) | function d(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLo...
  function p (line 1) | function p(t,r){var i=t.length;if("CSS"in e&&"supports"in e.CSS){for(;i-...
  function m (line 1) | function m(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return...
  function h (line 1) | function h(e,t,i,o){function a(){c&&(delete _.style,delete _.modElem)}if...
  function g (line 1) | function g(e,t,n){var i;for(var o in e)if(e[o]in t)return n===!1?e[o]:(i...
  function v (line 1) | function v(e,t,n,i,o){var a=e.charAt(0).toUpperCase()+e.slice(1),s=(e+" ...
  function y (line 1) | function y(e,t,r){return v(e,n,n,t,r)}
  function n (line 1) | function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("hea...
  function r (line 1) | function r(){var e=C.elements;return"string"==typeof e?e.split(" "):e}
  function i (line 1) | function i(e,t){var n=C.elements;"string"!=typeof n&&(n=n.join(" ")),"st...
  function o (line 1) | function o(e){var t=w[e[S]];return t||(t={},b++,e[S]=b,w[b]=t),t}
  function a (line 1) | function a(e,n,r){if(n||(n=t),g)return n.createElement(e);r||(r=o(n));va...
  function s (line 1) | function s(e,n){if(e||(e=t),g)return e.createDocumentFragment();n=n||o(e...
  function l (line 1) | function l(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.crea...
  function u (line 1) | function u(e){e||(e=t);var r=o(e);return!C.shivCSS||h||r.hasCSS||(r.hasC...
  function c (line 1) | function c(e){for(var t,n=e.getElementsByTagName("*"),i=n.length,o=RegEx...
  function f (line 1) | function f(e){for(var t,n=e.attributes,r=n.length,i=e.ownerDocument.crea...
  function d (line 1) | function d(e){for(var t,n=e.split("{"),i=n.length,o=RegExp("(^|[\\s,>+~]...
  function p (line 1) | function p(e){for(var t=e.length;t--;)e[t].removeNode()}
  function m (line 1) | function m(e){function t(){clearTimeout(a._removeSheetTimer),r&&r.remove...
  function e (line 1) | function e(e,t){var i;return e?(t&&"string"!=typeof t||(t=u(t||"div")),e...
  function t (line 1) | function t(){E(!0)}
Condensed preview — 323 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,147K chars).
[
  {
    "path": ".all-contributorsrc",
    "chars": 20697,
    "preview": "{\n  \"projectName\": \"night\",\n  \"projectOwner\": \"talkgo\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"f"
  },
  {
    "path": ".gitattributes",
    "chars": 24,
    "preview": "*.* linguist-language=go"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 64,
    "preview": "# These are supported funding model platforms\n\npatreon: maiyang\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/share_request.md",
    "chars": 300,
    "preview": "---\nname: '提案:如何发起一次分享请求?'\ntitle: '【发起分享提案】'\nlabels: 分享话题, Go 夜读\nassignees: yangwenmai, changkun\nabout: 此模板主要用于如何发起分享提案的"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/share_template.md",
    "chars": 662,
    "preview": "---\nname: '第 100 期<你的话题名称>'\ntitle: '【分享计划】'\nlabels: 分享话题, Go 夜读, 预习资料\nassignees: yangwenmai, changkun\nabout: 此模板主要是针对提交分"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 512,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/weekly-digest.yml",
    "chars": 228,
    "preview": "# Configuration for weekly-digest - https://github.com/apps/weekly-digest\npublishDay: \"thursday\"\ncanPublishIssues: true\n"
  },
  {
    "path": ".github/workflows/links.yml",
    "chars": 631,
    "preview": "name: Links\n\non:\n  repository_dispatch:\n  workflow_dispatch:\n  schedule:\n    - cron: \"0 0 1 * *\"\n\njobs:\n  linkChecker:\n "
  },
  {
    "path": ".github/workflows/monthly.yml",
    "chars": 431,
    "preview": "name: auto_monthly_recommend\n\non:\n  schedule:\n  - cron: \"0 12 1 * *\"\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    step"
  },
  {
    "path": ".gitignore",
    "chars": 375,
    "preview": "# Binaries for programs and plugins\n*.exe\n*.dll\n*.so\n*.dylib\n\n# Test binary, build with `go test -c`\n*.test\n\n# Output of"
  },
  {
    "path": ".markdownlint.json",
    "chars": 181,
    "preview": "{\n    \"default\": true,\n    \"MD007\": false,\n    \"no-hard-tabs\": false,\n    \"line-length\": false,\n    \"no-inline-html\": {\n"
  },
  {
    "path": ".netlify/state.json",
    "chars": 53,
    "preview": "{\n\t\"siteId\": \"6ec64a83-fe6a-4891-8090-d75129fa87be\"\n}"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2279,
    "preview": "---\ntitle: 如何参与贡献?\n---\n\n欢迎大家参与讨论,更欢迎大家多多的回馈社区,来开始共享吧!\n\n## 贡献流程\n\n### 第一步:Fork [https://github.com/talkgo/night](https://g"
  },
  {
    "path": "CONTRIBUTORS",
    "chars": 582,
    "preview": "yangwenmai\nmougeCM\nyuhao5\ncharnlsxy\nAceDarkknight\ngnuos\nKISSMonX\ndumliu01\nhlily2005\nhenrylee2cn\nshaqsnake\nTBWISK\ntoonton"
  },
  {
    "path": "HISTORY.md",
    "chars": 13712,
    "preview": "## Go 夜读发展历史\n\n>Go 夜读起源于 Go 语言学习,提升团队 Go 语言技术能力水平,营造一些 Go 语言学习的氛围,但是在公司内部坚持了几周之后,就因为赶项目搁置了。后面项目稍微闲暇之后,就又重启此项目,不过经过这一段时间的中"
  },
  {
    "path": "JOINUS.md",
    "chars": 272,
    "preview": "# 如何加入 Go 夜读 SIG 小组?\n\n>已不再纳新。\n\n你可以联系 Go 夜读 SIG 小组成员,最好准备以下内容:\n\n1. 完整的自我介绍,包括:\n- 个人信息\n- 工作内容\n- 个人爱好\n- 对开源社区有哪些贡献?\n- 演讲的能力"
  },
  {
    "path": "LICENSE",
    "chars": 1063,
    "preview": "MIT License\n\nCopyright (c) 2020 talkgo\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
  },
  {
    "path": "Makefile",
    "chars": 146,
    "preview": "HUGO = hugo\n\nall: clean\n\t$(if $(shell PATH=$(PATH) which $(HUGO)),hugo -D --minify,$(error \"No $(HUGO) in PATH\"))\n\nclean"
  },
  {
    "path": "README.md",
    "chars": 99564,
    "preview": "<img src=\"https://raw.githubusercontent.com/talkgo/night/master/static/images/2018-12-11-night-reading-go.jpg\" alt=\"logo"
  },
  {
    "path": "SHARE_REQUEST_PROPOSAL.md",
    "chars": 644,
    "preview": "# 如何发起分享提案?\n\n## 背景\n\n你是否经常困扰于某些 Go 话题没有人分享或者很少人关注?自己很想深入研究,但是却是形单影只,经常半途而废呢?\n\nGo 夜读提供给大家一种渠道,希望可以将探究深入到 Go 的方方面面,只要你愿意跟我们"
  },
  {
    "path": "actions/go.mod",
    "chars": 255,
    "preview": "module night/actions\n\ngo 1.24.0\n\nrequire (\n\tgithub.com/dyweb/gommon v0.0.13\n\tgithub.com/google/go-github/v29 v29.0.3\n\tgo"
  },
  {
    "path": "actions/issuesinfo.json",
    "chars": 522,
    "preview": "{\r\n    \"title\":\"TalkGo 读书会月度推荐书单\",\r\n    \"body\":\"欢迎大家踊跃推荐好书:\\r\\n\\u003e来这里的小伙伴,一定给你喜欢的推荐书点个赞:+1:,点赞越高的书将有机会被选为 TalkGo 读书会的"
  },
  {
    "path": "actions/monthly.go",
    "chars": 2150,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"github.com/dyweb/gommon/util/httputil\"\n\t\"github.com/"
  },
  {
    "path": "archetypes/default.md",
    "chars": 84,
    "preview": "---\ntitle: \"{{ replace .Name \"-\" \" \" | title }}\"\ndate: {{ .Date }}\ndraft: true\n---\n\n"
  },
  {
    "path": "config.toml",
    "chars": 2054,
    "preview": "baseurl = \"https://talkgo.org/\"\ntitle = \"Go 夜读\"\ntheme = \"hugo-material-docs\"\nmetadataformat = \"yaml\"\ncanonifyurls = true"
  },
  {
    "path": "content/_index.md",
    "chars": 65,
    "preview": "---\ntitle: \"Go 夜读\"\ndate: 2018-11-15T12:32:37+08:00\nweight: 1\n---\n"
  },
  {
    "path": "content/algorithms/2020-12-27.md",
    "chars": 530,
    "preview": "---\ntitle: 2020-12-27 TalkGo 算法之美微信群今日讨论问题\ndate: 2020-12-27T22:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2020-12-27\n\n---\n\n"
  },
  {
    "path": "content/algorithms/2020-12-28.md",
    "chars": 399,
    "preview": "---\ntitle: 2020-12-28 TalkGo 算法之美第三期第一周第一阶段\ndate: 2020-12-28T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2020-12-28\n\n---\n"
  },
  {
    "path": "content/algorithms/2020-12-29.md",
    "chars": 886,
    "preview": "---\ntitle: 2020-12-29 TalkGo 算法之美第三期第一周第二阶段\ndate: 2020-12-29T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2020-12-29\n\n---\n"
  },
  {
    "path": "content/algorithms/2020-12-30.md",
    "chars": 354,
    "preview": "---\ntitle: 2020-12-30 TalkGo 算法之美第三期第一周第二阶段\ndate: 2020-12-30T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2020-12-30\n\n---\n"
  },
  {
    "path": "content/algorithms/2021-01-01.md",
    "chars": 415,
    "preview": "title: 2021-01-01 TalkGo 算法之美第三期第一周第三阶段\ndate: 2021-01-01T08:31:00+08:00\n\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-01\n\n---\n\n- 2021"
  },
  {
    "path": "content/algorithms/2021-01-03.md",
    "chars": 304,
    "preview": "---\ntitle: 2021-01-03 TalkGo 算法之美第三期第一周第三阶段\ndate: 2021-01-03T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-03\n\n---\n"
  },
  {
    "path": "content/algorithms/2021-01-06.md",
    "chars": 214,
    "preview": "---\ntitle: 2021-01-06 TalkGo 算法之美第三期第二周第三阶段\ndate: 2021-01-06T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-06\n\n---\n"
  },
  {
    "path": "content/algorithms/2021-01-08.md",
    "chars": 213,
    "preview": "---\ntitle: 2021-01-08 TalkGo 算法之美第三期第二周第三阶段\ndate: 2021-01-08T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-08\n\n---\n"
  },
  {
    "path": "content/algorithms/2021-01-09.md",
    "chars": 265,
    "preview": "---\ntitle: 2021-01-09 TalkGo 算法之美第三期第三周第二阶段\ndate: 2021-01-09T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-9\n\n---\n\n"
  },
  {
    "path": "content/algorithms/2021-01-11.md",
    "chars": 210,
    "preview": "---\ntitle: 2021-01-11 TalkGo 算法之美第三期第三周第一阶段\ndate: 2021-01-11T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-11\n\n---\n"
  },
  {
    "path": "content/algorithms/2021-01-12.md",
    "chars": 452,
    "preview": "---\ntitle: 2021-01-12 TalkGo 算法之美第三期第三周第二阶段\ndate: 2021-01-12T08:31:00+08:00\n---\n来源:『TalkGo 算法之美』微信群\n\n时间:2021-01-12\n\n---\n"
  },
  {
    "path": "content/articles/2018-05-31-batch-del-redis-key.md",
    "chars": 1155,
    "preview": "---\ntitle: 批量删除redis中的key\ndate: 2018-05-31T00:00:00+08:00\n---\n\n* **1.首先看图**\n\n![](/images/batch-del-redis-key_one.png)\n\n\n"
  },
  {
    "path": "content/articles/2018-11-11-golang-file-lock.md",
    "chars": 1672,
    "preview": "---\ntitle: golang 的文件锁操作\ndate: 2018-11-11T00:00:00+08:00\n---\n\n这篇文章给大家介绍一下 golang 的文件锁。我们在使用 golang 开发程序的时候,经常会出现多个 gorou"
  },
  {
    "path": "content/articles/2019-11-07-Raft--易于理解的一致性算法.md",
    "chars": 9038,
    "preview": "---\ntitle: Raft--易于理解的一致性算法\ndate: 2019-11-07T00:00:00+23:00\n---\n\n这篇文章讲解如何用 go 实现 raft 算法,代码框架来自于 Mit6.824分布式课程\n\n最初,为了学习分"
  },
  {
    "path": "content/articles/2020-02-08-source_go_flag.md",
    "chars": 6956,
    "preview": "---\ntitle: \"Go 源码阅读之 flag 包\"\ndate: 2020-02-08T17:54:04+08:00\n---\n\n- [简介](#%e7%ae%80%e4%bb%8b)\n- [文件结构](#%e6%96%87%e4%bb%"
  },
  {
    "path": "content/articles/_index.md",
    "chars": 64,
    "preview": "---\ntitle: \"分享文章\"\ndate: 2018-11-15T12:32:37+08:00\nweight: 5\n---\n"
  },
  {
    "path": "content/articles/goroutine_and_channel/README.md",
    "chars": 15513,
    "preview": "# goroutine和通道\n<!-- TOC -->\n\n- [goroutine和通道](#goroutine%e5%92%8c%e9%80%9a%e9%81%93)\n\t- [goroutine和通道](#goroutine%e5%92%"
  },
  {
    "path": "content/articles/how_to_profile/how_to_profile.md",
    "chars": 47160,
    "preview": "---\ntitle: \"HOW TO PROFILE\"\ndate: 2019-01-24T15:09:31+08:00\ndraft: true\n---\n\n介绍使用Benchmark进行调优。\n\n- 如何写压测示例;\n- 如何使用压测程序进行"
  },
  {
    "path": "content/articles/how_to_test/README.md",
    "chars": 20012,
    "preview": "---\ntitle: \"how to testing\"\ndate: 2018-12-25T00:00:00+08:00\nauthor: xpzouying@gmail.com\n---\n\n\n# HOW TO TESTING\n\n原文/源码参考:"
  },
  {
    "path": "content/articles/sonarqube-for-golang/2018-07-22-sonarqube-for-golang.md",
    "chars": 11176,
    "preview": "---\ntitle: Golang 代码质量持续检测\n---\n> Author: Kenny Allen\n>\n> Email:    kennyallen0520@gmail.com\n\n## 前言\n\n在软件开发过程中,人工检查项目代码中的漏"
  },
  {
    "path": "content/articles/sonarqube-for-golang/Dockerfile",
    "chars": 1364,
    "preview": "FROM openjdk:8\n\nENV SONAR_VERSION=7.2.1 \\\n    SONARQUBE_HOME=/opt/sonarqube \\\n    SONARQUBE_JDBC_USERNAME=sonar \\\n    SO"
  },
  {
    "path": "content/articles/sonarqube-for-golang/index.md",
    "chars": 10887,
    "preview": "---\ntitle: Golang 代码质量持续检测\ndate: 2018-07-22T00:00:00+08:00\n---\n\n> Author: Kenny Allen\n>\n> Email:    kennyallen0520@gmail"
  },
  {
    "path": "content/articles/sonarqube-for-golang/run.sh",
    "chars": 491,
    "preview": "#!/bin/bash\n\nset -e\n\nif [ \"${1:0:1}\" != '-' ]; then\n  exec \"$@\"\nfi\n\nchown -R sonarqube:sonarqube $SONARQUBE_HOME\nexec go"
  },
  {
    "path": "content/articles/sony-gobreaker/README.md",
    "chars": 2919,
    "preview": "---\ntitle: \"Sony gobreaker熔断器源码分析\"\ndate: 2018-07-26T00:00:00+08:00\nauthor: HuangChuanTonG@WPS.cn\n---\n\n最近看了一下go-kit,发现这个微"
  },
  {
    "path": "content/articles/sync/README.md",
    "chars": 118,
    "preview": "---\ntitle: 说明\n---\n内容均来自[OSC_梦朝思夕博客](https://my.oschina.net/u/553243),[51CTO_梦朝思夕博客](http://blog.51cto.com/qiangmzsx)\n\n"
  },
  {
    "path": "content/articles/sync/sync_Map_source_code_analysis.md",
    "chars": 9925,
    "preview": "---\ntitle: sync.Map源码分析\ndate: 2018-09-08T00:00:00+08:00\n---\n\n## 背景\n众所周知,go普通的map是不支持并发的,换而言之,不是线程(goroutine)安全的。博主是从gola"
  },
  {
    "path": "content/articles/sync/sync_cond_source_code_analysis.md",
    "chars": 2789,
    "preview": "---\ntitle: sync.Cond源码分析\ndate: 2018-09-08T00:00:00+08:00\n---\n\nCond的主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放"
  },
  {
    "path": "content/articles/sync/sync_mutex_source_code_analysis.md",
    "chars": 5086,
    "preview": "---\ntitle: sync.Mutex 源码分析\ndate: 2018-09-08T00:00:00+08:00\n---\n针对 Golang 1.10.3 的 sync.Mutex 进行分析,代码位置:`sync/mutex.go`\n\n"
  },
  {
    "path": "content/articles/sync/sync_once_source_code_analysis.md",
    "chars": 593,
    "preview": "---\ntitle: sync.Once源码分析\ndate: 2018-09-08T00:00:00+08:00\n---\nsync.Once可以实现单例模式,确保sync.Once.Do(f func())只会被执行一次,可以初始化某个实例"
  },
  {
    "path": "content/articles/sync/sync_rwmutex_source_code_analysis.md",
    "chars": 2640,
    "preview": "---\ntitle: sync.RWMutex源码分析\ndate: 2018-09-08T00:00:00+08:00\n---\n针对 Golang 1.9 的 sync.RWMutex 进行分析,与 Golang 1.10 基本一样除了将`"
  },
  {
    "path": "content/articles/sync/sync_waitgroup_source_code_analysis.md",
    "chars": 3571,
    "preview": "---\ntitle: sync.WaitGroup源码分析\ndate: 2018-09-08T00:00:00+08:00\n---\n针对Golang 1.9的sync.WaitGroup进行分析,与Golang 1.10基本一样除了将`pa"
  },
  {
    "path": "content/discuss/2018-05-08-anlayze-underscore-in-go.md",
    "chars": 6574,
    "preview": "---\ntitle: 2018-05-08 Go 语言中下划线的用法分析总结\ndate: 2018-05-08T00:00:00+08:00\n---\n\n讨论时间:2018-05-08 19:25 ~ 2018-05-08 20:00\n\n以下"
  },
  {
    "path": "content/discuss/2018-05-09-wechat-discuss.md",
    "chars": 1067,
    "preview": "---\ntitle: 2018-05-09 微信群讨论\ndate: 2018-05-09T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n时间:2018-05-09\n\n## 1. debug\n\n调试:dlv\n\n(待补充"
  },
  {
    "path": "content/discuss/2018-05-10-which-vendor-tool.md",
    "chars": 1022,
    "preview": "---\ntitle: 2018-05-10 用什么工具解决项目依赖\ndate: 2018-05-10T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n时间:2018-05-10 13:30\n\n## 1. 你们是用什么工具"
  },
  {
    "path": "content/discuss/2018-05-13-declaring-variables-on-if-else.md",
    "chars": 2792,
    "preview": "---\ntitle: 2018-05-13 关于变量在 if-else 条件表达式里的作用域范围\ndate: 2018-05-13T00:00:00+08:00\n---\n\n## 一. 如何发现这个问题?\n\n我是在浏览 `Twitter` 的"
  },
  {
    "path": "content/discuss/2018-05-16-the-way-to-go.md",
    "chars": 850,
    "preview": "---\ntitle: 2018-05-16 Go 学习之路\ndate: 2018-05-16T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n时间:2018-05-16\n\n----\n\n>推荐新手先看一看[Go 学习之路]("
  },
  {
    "path": "content/discuss/2018-05-18-bitset-and-import-cycle-not-allowed.md",
    "chars": 3796,
    "preview": "---\ntitle:  2018-05-18 包循环依赖如何解决\nsource: 『Go 夜读』微信群\ndate: 2018-05-18T00:00:00+08:00\n---\n## 1. 包循环依赖如何解决?\n\n![import_cycle"
  },
  {
    "path": "content/discuss/2018-05-21-using-goroutines-on-loop-iterator-variables.md",
    "chars": 1699,
    "preview": "---\ntitle: 2018-05-21 微信讨论\ndate: 2018-05-21T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n时间:2018-05-21\n\n----\n\n## 1. 如下代码何解?\n\n```go"
  },
  {
    "path": "content/discuss/2018-05-22-go-string-to-byte-slice.md",
    "chars": 1885,
    "preview": "---\ntitle: 2018-05-22 Go string to byte slice\ndate: 2018-05-22T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-05-22\n\n----\n\n##"
  },
  {
    "path": "content/discuss/2018-05-23-wechat-discuss.md",
    "chars": 894,
    "preview": "---\ntitle:  2018-05-23 Get passes lock by value\ndate: 2018-05-23T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-05-23\n\n----\n\n"
  },
  {
    "path": "content/discuss/2018-05-28-pprof-in-go.md",
    "chars": 1579,
    "preview": "---\ntitle: 2018-05-28 生产环境如何调试服务的内存泄露\ndate: 2018-05-28T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-05-28\n\n----\n\n## 1. 生产环境"
  },
  {
    "path": "content/discuss/2018-06-07-dial-timeout-in-go.md",
    "chars": 1206,
    "preview": "---\ntitle: 2018-06-07 Dial 超时\ndate: 2018-06-07T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-06-07\n\n----\n\n## 问题1\n\n```go\nfunc"
  },
  {
    "path": "content/discuss/2018-07-02-c1000k-on-linux.md",
    "chars": 1878,
    "preview": "---\ntitle:  2018-07-02 在Linux操作系统环境,单机如何支撑100万并发的服务\ndate: 2018-07-02T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-07-02\n\n--"
  },
  {
    "path": "content/discuss/2018-07-04-package-names.md",
    "chars": 463,
    "preview": "---\ntitle: 2018-07-04 文件夹命名\ndate: 2018-07-04T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-07-04\n\n----\n\n## 问题1. 话说大家 go 文件夹命"
  },
  {
    "path": "content/discuss/2018-07-09-make-new-in-go.md",
    "chars": 2976,
    "preview": "---\ntitle: 2018-07-09 怎么建立一个一一映射?\ndate: 2018-07-09T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-07-09\n\n----\n\n## 问题1. golang"
  },
  {
    "path": "content/discuss/2018-07-11-using_64bit_atomic_in_32bit_system.md",
    "chars": 2671,
    "preview": "---\ntitle: 2018-07-11 在32位系统中使用64位原子操作的坑\ndate: 2018-07-11T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-07-11\n\n----\n\n## 在32位"
  },
  {
    "path": "content/discuss/2018-07-14-version-gopath-go-command.md",
    "chars": 881,
    "preview": "---\ntitle: 2018-07-14 包版本管理\ndate: 2018-07-14T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-07-14\n\n----\n\n## 问题1:包版本管理?\n\ngoven"
  },
  {
    "path": "content/discuss/2018-07-31-println-Println-and_context.md",
    "chars": 2074,
    "preview": "---\ntitle: 2018-07-31 println 与 fmt.Println 有何猫腻\ndate: 2018-07-31T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n时间:2018-07-31\n\n----"
  },
  {
    "path": "content/discuss/2018-08-02-apns-push-notification.md",
    "chars": 5484,
    "preview": "---\ntitle: 2018-08-02 Push Notification (apns)\ndate: 2018-08-02T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n时间:2018-08-02\n\n----\n \n#"
  },
  {
    "path": "content/discuss/2018-08-02-go-shell.md",
    "chars": 1704,
    "preview": "---\ntitle:  2018-08-02 Go 调用 shell 脚本如何传递参数\ndate: 2018-08-02T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n时间:2018-08-02\n\n### 问题:Go "
  },
  {
    "path": "content/discuss/2018-08-09-log-color-in-go.md",
    "chars": 1614,
    "preview": "---\ntitle: 2018-08-09 Log 的颜色能设置吗\ndate: 2018-08-09T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-08-09\n\n### 问题:Log 的颜色能设置吗?\n"
  },
  {
    "path": "content/discuss/2018-08-14-wechat-discuss.md",
    "chars": 1432,
    "preview": "---\ntitle: 2018-08-14 做实时语音流,用什么来做比较好\ndate: 2018-08-14T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-08-14\n\n### 问题:做实时语音流,用什"
  },
  {
    "path": "content/discuss/2018-08-15-wechat-discuss.md",
    "chars": 1476,
    "preview": "---\ntitle: 2018-08-15 深度 | 从 Go 高性能日志库 zap 看如何实现高性能 Go 组件\ndate: 2018-08-15T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-08-"
  },
  {
    "path": "content/discuss/2018-08-23-wechat-discuss.md",
    "chars": 1422,
    "preview": "---\ntitle: 2018-08-23 有什么好的博客平台吗\ndate: 2018-08-23T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-08-23\n\n### 有什么好的博客平台吗?(除了简书)"
  },
  {
    "path": "content/discuss/2018-08-24-wechat-discuss.md",
    "chars": 565,
    "preview": "---\ntitle: 2018-08-24 工具推荐\ndate: 2018-08-24T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-08-24\n\n### 工具推荐\n\n1. [SequelPro(MyS"
  },
  {
    "path": "content/discuss/2018-08-30-understanding-go-interfaces.md",
    "chars": 2049,
    "preview": "---\ntitle: 2018-08-30 理解 Go interface\ndate: 2018-08-30T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-08-30\n\n### Go 语言不同接口、声明"
  },
  {
    "path": "content/discuss/2018-09-04-wechat-discuss.md",
    "chars": 1104,
    "preview": "---\ntitle: 2018-09-04 微信讨论\ndate: 2018-09-04T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n### Request Body 的请求中,不能 bind 两次吗?\n\n```gol"
  },
  {
    "path": "content/discuss/2018-09-05-git-system.md",
    "chars": 1670,
    "preview": "---\ntitle: 2018-09-05 微信讨论\ndate: 2018-09-05T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n### [xxxxx [1 2 3 4]] 如何做到输出为[ssss 1 2 3 4"
  },
  {
    "path": "content/discuss/2018-09-14-tips-in-vscode.md",
    "chars": 2652,
    "preview": "---\ntitle: 2018-09-14 VSCode 如何代码自动补全和自动导入包\ndate: 2018-09-14T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n### VSCode 如何代码自动补全和自动导入包"
  },
  {
    "path": "content/discuss/2018-09-18-benchmark-tools.md",
    "chars": 235,
    "preview": "---\ntitle: 2018-09-18 压测接口性能的框架,大家有没有推荐\ndate: 2018-09-18T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n### 压测接口性能的框架,大家有没有推荐?\n\n- [wr"
  },
  {
    "path": "content/discuss/2018-09-19-wechat-discuss.md",
    "chars": 1486,
    "preview": "---\ntitle: 2018-09-19 微信讨论\ndate: 2018-09-19T00:00:00+08:00\n---\n来源: Wechat discuss\n\n时间:2018-09-19\n\n## Producer to Consume"
  },
  {
    "path": "content/discuss/2018-09-28-return-value-in-waitgroup.md",
    "chars": 2486,
    "preview": "---\ntitle: 2018-09-28 goroutine 中怎么得到返回值\ndate: 2018-09-28T00:00:00+08:00\n---\n\n来源: Wechat discuss\n\n时间:2018-09-28\n\n## goro"
  },
  {
    "path": "content/discuss/2018-10-18-encOp.md",
    "chars": 1215,
    "preview": "---\ntitle: 2018-10-18 encOp 是在哪里实现的呢?\ndate: 2018-10-18T00:00:00+08:00\n---\n来源: Wechat discuss\n\n## encOp 是在哪里实现的呢?\n\n>encod"
  },
  {
    "path": "content/discuss/2018-11-08-address_operators.md",
    "chars": 1630,
    "preview": "---\ntitle:  2018-11-08 Address operators\ndate: 2018-11-08T00:00:00+08:00\n---\n来源: Wechat discuss\n\n## Address_operators\n\n`"
  },
  {
    "path": "content/discuss/2018-11-08-aws-ec2-ssh-login-problem.md",
    "chars": 716,
    "preview": "---\ntitle:  2018-11-08 aws ec2实例无法连接登录问题\ndate: 2018-11-08T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-11-08\n\n---\n\n## aws e"
  },
  {
    "path": "content/discuss/2018-11-09-force-to-use-keyed-struct-literals.md",
    "chars": 1063,
    "preview": "---\ntitle:  2018-11-09 强制使用字段命名方式初始化结构体\ndate: 2018-11-09T00:00:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-11-09\n\n---\n\n## 强制使用字段"
  },
  {
    "path": "content/discuss/2018-11-29-config-in-go.md",
    "chars": 191,
    "preview": "---\ntitle: Golang 用什么配置中心管理服务\ndate: 2018-11-29T17:13:46+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-11-29\n\n---\n\n## Golang 用什么配置中心管理"
  },
  {
    "path": "content/discuss/2018-12-04-change-to-go.md",
    "chars": 522,
    "preview": "---\ntitle: 实打实的 Go 项目,但是 Github 却统计为 JavaScript 怎么办?\ndate: 2018-12-04T17:13:46+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2018-12-04\n\n-"
  },
  {
    "path": "content/discuss/2018-12-04-wechat-discuss.md",
    "chars": 1428,
    "preview": "---\ntitle: \"2018-12-04 微信讨论\"\ndate: 2018-12-04T17:13:46+08:00\n---\n\n来源:『Go 夜读』微信群\n\n## json 解析结构体断言问题\n\n```golang\npackage ma"
  },
  {
    "path": "content/discuss/2018-12-07-wechat-discuss.md",
    "chars": 347,
    "preview": "---\ntitle: \"2018-12-07 微信讨论\"\ndate: 2018-12-07T23:13:46+08:00\n---\n\n来源:『Go 夜读』微信群\n\n>应该还是负数问题,你实验一下\n\n下面这种情况的负数报错是在 build 阶段"
  },
  {
    "path": "content/discuss/2018-12-11-wechat-discuss.md",
    "chars": 3134,
    "preview": "---\ntitle: \"2018-12-11 微信讨论\"\ndate: 2018-12-11T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n时间:2018-12-11\n\n## Golang module初始化\n使用go"
  },
  {
    "path": "content/discuss/2018-12-25-macOS-time-synchronization.md",
    "chars": 634,
    "preview": "---\ntitle: 2018-12-25 MacOS Time Synchronization\ndate: 2018-12-25T16:36:45+08:00\n---\n来源: Wechat discuss\n\n## MacOS Time S"
  },
  {
    "path": "content/discuss/2019-01-10-anlayze-range.md",
    "chars": 2033,
    "preview": "---\ntitle: 2019-01-10 关于range的一些不易察觉的\"坑\"\ndate: 2019-01-10T00:00:00+08:00\n---\n\n来源: Wechat discuss\n\n\n### 1. 以下代码最终的结果是什么?\n"
  },
  {
    "path": "content/discuss/2019-02-20-bigdecimal-show-string.md",
    "chars": 333,
    "preview": "---\ntitle: 2019-02-20 浮点数如何输出\ndate: 2019-02-20T00:00:00+08:00\n---\n\n来源: Wechat discuss\n\n\n### 将数据序列化为json的时候,怎么让序列化后的 json"
  },
  {
    "path": "content/discuss/2019-03-07-wechat-discuss.md",
    "chars": 3771,
    "preview": "---\ntitle: \"2019-03-07 微信讨论\"\ndate: 2019-03-07T10:51:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n## 1 Goland中println和fmt.Print乱序原因\n\n**Qu"
  },
  {
    "path": "content/discuss/2019-03-08-wechat-discuss.md",
    "chars": 6569,
    "preview": "---\ntitle: \"2019-03-08 微信讨论\"\ndate: 2019-03-08T21:00:00+08:00\n---\n\n## 读写锁引入\n\n有下面一段程序,面试官问这段程序有什么问题?\n\n```\ntype Store struc"
  },
  {
    "path": "content/discuss/2019-03-26-gopsutil.md",
    "chars": 2083,
    "preview": "---\ntitle: 2019-03-26 微信群讨论\ndate: 2019-03-26T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n时间:未知\n\n## 背景\n\n先前由于公司这边要做一些基础指标的监控上报,因此之前在"
  },
  {
    "path": "content/discuss/2019-04-10-remove-local-branch-in-merged-master.md",
    "chars": 972,
    "preview": "---\ntitle: 2019-04-10 \ndate: 2019-04-10T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n## 本地开发分支已经 merge 到 master 后,如何快捷的删除本地开发分支?\n\n"
  },
  {
    "path": "content/discuss/2019-05-15-jaeger.md",
    "chars": 2024,
    "preview": "---\ntitle: 2019-05-15 \ndate: 2019-05-15T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\nQ: jaeger好像是由入口服务决策这条trace是否需要采样上报的?所有下游的服务都会"
  },
  {
    "path": "content/discuss/2019-05-21-chromedp.md",
    "chars": 424,
    "preview": "---\ntitle: 2019-05-21 浏览器自动化工具\ndate: 2019-05-21T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n----\n\nA0: chromedp 浏览器自动化工具,还有 puppet"
  },
  {
    "path": "content/discuss/2019-06-19-gorm-mysql-timestamp.md",
    "chars": 8138,
    "preview": "---\ntitle: 2019-06-19 Go、Gorm 与 MySQL timestamp\ndate: 2019-06-19T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n----\n\nGo、Gorm与MySQL中"
  },
  {
    "path": "content/discuss/2019-07-16-assign-and-range.md",
    "chars": 2071,
    "preview": "---\ntitle: 2019-07-16 := 的由来和 range 遍历\ndate: 2019-07-16T00:00:00+08:00\n---\n\n来源:『Go 夜读』微信群\n\n----\n\n## := 的由来\n\n0.23 BNF 和 E"
  },
  {
    "path": "content/discuss/2019-07-17-global-variable-init.md",
    "chars": 3823,
    "preview": "---\ntitle: 2019-07-17 go程序运行初始化顺序\ndate: 2019-07-17T00:00:00+08:00\n---\n来源:『Go夜读』微信群\n\n时间:2019-07-17\n\n---\n\n## 1. go程序运行初始化顺"
  },
  {
    "path": "content/discuss/2019-10-13-go-module-looping-package.md",
    "chars": 830,
    "preview": "---\ntitle: go mod下出现looping trying to add package\ndate: 2019-10-13T12:12:00+08:00\n---\n来源:『Go 夜读』微信群\n\n时间:2019-10-13\n\n---\n"
  },
  {
    "path": "content/discuss/_index.md",
    "chars": 64,
    "preview": "---\ntitle: \"夜读讨论\"\ndate: 2018-11-15T12:32:37+08:00\nweight: 5\n---\n"
  },
  {
    "path": "content/discuss/log_color_test.go",
    "chars": 891,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\n// TestLogColor 测试日志颜色\nfunc TestLogColor(t *testing.T) {\n\tfmt.Println(\"\")\n\n\t"
  },
  {
    "path": "content/harvest/_index.md",
    "chars": 64,
    "preview": "---\ntitle: \"你的收获\"\ndate: 2019-01-10T11:00:00+08:00\nweight: 8\n---\n"
  },
  {
    "path": "content/harvest/harvest.md",
    "chars": 1789,
    "preview": "---\ntitle: 你在 Go 夜读有哪些收获/感想呢?\ndate: 2019-01-10T00:00:00+08:00\n---\n\n## 收获/感想\n\n如果你觉得这个项目对你有帮助,请在这里写下哪些项目或者文章对你有帮助,具体帮了你哪些?"
  },
  {
    "path": "content/home.md",
    "chars": 25524,
    "preview": "---\ndate: 2018-11-08T21:07:13+01:00\nlast_date: 2020-03-05T15:08:00+08:00\ntitle: Go 夜读\ntype: index\nweight: 0\n---\n\n<img sr"
  },
  {
    "path": "content/interview/_index.md",
    "chars": 64,
    "preview": "---\ntitle: \"面试专题\"\ndate: 2018-11-15T12:32:37+08:00\nweight: 7\n---\n"
  },
  {
    "path": "content/interview/articles/interview_analysis_1.md",
    "chars": 7953,
    "preview": "---\ntitle:  Golang面试题解析(一)\ndate: 2018-07-26T00:00:00+08:00\n---\n\n最近在很多地方看到了[golang的面试题](https://zhuanlan.zhihu.com/p/2697"
  },
  {
    "path": "content/interview/articles/interview_analysis_2.md",
    "chars": 3341,
    "preview": "---\ntitle:  Golang面试题解析(二)\ndate: 2018-07-26T00:00:00+08:00\n---\n\n## 12.是否可以编译通过?如果通过,输出什么?\n```go  \nfunc main() {\n\ti := Ge"
  },
  {
    "path": "content/interview/articles/interview_analysis_3.md",
    "chars": 4294,
    "preview": "---\ntitle:  Golang面试题解析(三)\ndate: 2018-07-26T00:00:00+08:00\n---\n\n# 21.编译执行下面代码会出现什么?\n```go  \npackage main\nvar(\n    size :"
  },
  {
    "path": "content/interview/articles/interview_analysis_4.md",
    "chars": 4983,
    "preview": "---\ntitle:  Golang面试题解析(四)\ndate: 2018-07-26T00:00:00+08:00\n---\n\n## 31. 算法\n在utf8字符串判断是否包含指定字符串,并返回下标。\n\"北京天安门最美丽\" , \"天安门\"\n"
  },
  {
    "path": "content/interview/interview-algorithm.md",
    "chars": 2159,
    "preview": "---\ntitle:  算法题\ndate: 2018-07-26T00:00:00+08:00\n---\n\n_1.如何在一个给定有序数组中找两个和为某个定值的数,要求时间复杂度为O(n),\n比如给{1,2,4,5,8,11,15}和15?_\n"
  },
  {
    "path": "content/interview/interview-architecture.md",
    "chars": 2514,
    "preview": "---\ntitle:  架构\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.Etcd满足了CAP原理中哪两个特性?_\n\n> etcd是高可用的键值存储系统。满足CP原理       \n\n_2.Etcd V2和"
  },
  {
    "path": "content/interview/interview-data-structure.md",
    "chars": 640,
    "preview": "---\ntitle:  数据结构\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.什么是跳跃表?_\n\n> 跳跃表是基于有序链表的一种扩展        \n>\n> [查看资料](http://blog.jobbo"
  },
  {
    "path": "content/interview/interview-database.md",
    "chars": 1943,
    "preview": "---\ntitle:  数据库\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.Mysql事物的隔离级别?_\n\n| **事务隔离级别**   |  **脏读** | **不可重复读** | **幻读** |\n|"
  },
  {
    "path": "content/interview/interview-design.md",
    "chars": 1032,
    "preview": "---\ntitle: 设计题\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.要设计一个秒杀系统要注意什么?_\n\n![](/images/miaosha.jpg)\n\n> **前端秒杀页面**\n>\n>> `页面静"
  },
  {
    "path": "content/interview/interview-golang-language.md",
    "chars": 2527,
    "preview": "---\ntitle:  Golang语言\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.select是随机的还是顺序的?_\n\n> select会`随机`选择一个可用通道做收发操作\n\n_2.Go语言局部变量分配"
  },
  {
    "path": "content/interview/interview-network.md",
    "chars": 1077,
    "preview": "---\ntitle:  网络\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.tcp三次握手和四次挥手流程示意图?在黑板上画出_\n\n> [查看资料](https://blog.csdn.net/smileiam"
  },
  {
    "path": "content/interview/interview-os.md",
    "chars": 1456,
    "preview": "---\ntitle: 操作系统\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.Select,Poll,Epoll的区别?_\n\n> `select`,`poll`,`epoll`都是IO多路复用的机制,具体区别"
  },
  {
    "path": "content/interview/interview-pen.md",
    "chars": 134,
    "preview": "---\ntitle: 笔试题\ndate: 2018-07-26T00:00:00+08:00\n---\n_1.Golang笔试题解析_\n\n> [查看资料](https://blog.csdn.net/weiyuefei/article/det"
  },
  {
    "path": "content/night/1-2018-03-21-goutil.md",
    "chars": 814,
    "preview": "---\ntitle: 第 1 期 2018-03-21 线下分享内容\ndate: 2018-03-21T11:49:10+08:00\n---\n>参与人数: 3 人\n\n## cannot take address of temporary v"
  },
  {
    "path": "content/night/1-2019-03-14-daily-reading.md",
    "chars": 3058,
    "preview": "---\ntitle: 第 1 期每日阅读特训营\ndate: 2019-03-14T09:10:00+08:00\n---\n\n# 阅读清单\n\n| 标题 | 阅读者 |\n|----|----|\n|[漫话:如何给女朋友解释为什么有些网站域名不以 w"
  },
  {
    "path": "content/night/10-2018-06-28-net-http-part4.md",
    "chars": 1342,
    "preview": "---\ntitle: 第 10 期 2018-06-28 线下活动\ndate: 2018-06-28T11:49:10+08:00\n---\n>参与人数: 10 人\n\n### Go 标准包阅读\n\n- Go版本:`go 1.10.2`\n\n###"
  },
  {
    "path": "content/night/104-2020-09-13-hashicorp-raft.md",
    "chars": 30156,
    "preview": "---\ndesc: Go 夜读之 通过 hashicorp/raft 库手把手调试 raft 算法\ntitle: 第 104 期通过 hashicorp/raft 库手把手调试 raft 算法-文字版\ndate: 2020-09-13T10"
  },
  {
    "path": "content/night/105-2020-10-03-go-zero-discuss.md",
    "chars": 4469,
    "preview": "---\ndesc: Go 夜读之 go-zero 微服务框架和线上答疑\ntitle: 第 105 期 go-zero 微服务框架和线上答疑\ndate: 2020-10-03T20:00:00+08:00\nauthor: 万俊峰(Kevin)"
  },
  {
    "path": "content/night/11-2018-07-26-golang-jenkins-sonarqube.md",
    "chars": 115,
    "preview": "---\ntitle: 第 11 期 Golang 代码质量持续检测实践\ndate: 2018-07-26T00:00:00+08:00\n---\n\n## 观看视频\n\n{{< youtube id=\"d95PZDAabqQ\" >}}\n"
  },
  {
    "path": "content/night/12-2018-08-02-goroutine-GPM.md",
    "chars": 14506,
    "preview": "---\ntitle: 第 12 期 golang 中 goroutine 的调度\ndate: 2018-08-02T11:49:10+08:00\n---\n\n郑宝杨(boya) 2018-08-01 listomebao@gmail.com\n"
  },
  {
    "path": "content/night/13-2018-08-09-kubernetes-guide.md",
    "chars": 188,
    "preview": "---\ndesc: 由 genpost (https://github.com/hidevopsio/genpost) 代码生成器生成\ntitle: 第 13 期 Kubernetes 入门指南\ndate: 2018-08-09T00:00"
  },
  {
    "path": "content/night/14-2018-08-17-sync-pool-reading.md",
    "chars": 129,
    "preview": "---\ntitle:  第 14 期 sync.Pool 源码分析及适用场景\ndate: 2018-08-17T11:49:10+08:00\n---\n\n*Go 标准包阅读*\n\n## 观看视频\n\n{{< youtube id=\"jaepwn2"
  },
  {
    "path": "content/night/15-2018-08-23-pool-workshop-in-go.md",
    "chars": 1605,
    "preview": "---\ntitle: 第 15 期 多路复用资源池组件剖析\ndate: 2018-08-23T11:49:10+08:00\n---\n\n>2018-08-23 22:00:00 分享会之后的答疑。\n\n----\n\n源代码地址:[pool#wor"
  },
  {
    "path": "content/night/16-2018-09-06-gateway-reading.md",
    "chars": 13192,
    "preview": "---\ntitle: 第 16 期 gateway-reading\ndate: 2018-09-06T11:49:10+08:00\ntags:\n---\n\nOpenFaaS的Gateway是一个golang实现的请求转发的网关,在这个网关服务"
  },
  {
    "path": "content/night/17-2018-09-20-grpcp.md",
    "chars": 194,
    "preview": "---\ndesc: 由 genpost (https://github.com/hidevopsio/genpost) 代码生成器生成\ntitle: 第 17 期 grpc 开发及 grpcp 的源码分析\ndate: 2018-09-20T"
  },
  {
    "path": "content/night/18-2018-09-27-CovenantSQL-DH-RPC.md",
    "chars": 206,
    "preview": "---\ndesc: 由 genpost (https://github.com/hidevopsio/genpost) 代码生成器生成\ntitle: 第 18 期 去中心化加密通信框架 CovenantSQL/DH-RPC的设计\ndate:"
  },
  {
    "path": "content/night/19-2018-11-08-http-router-in-go.md",
    "chars": 210,
    "preview": "---\ndesc: 由 genpost (https://github.com/hidevopsio/genpost) 代码生成器生成\ntitle: 第 19 期 如何开发一个简单高性能的http router及gorouter源码分析\nd"
  },
  {
    "path": "content/night/2-2018-04-11-teleport.md",
    "chars": 585,
    "preview": "---\ntitle: 第 2 期 2018-04-11 线下分享内容\ndate: 2018-04-11T11:49:10+08:00\n---\n>参与人数: 9 人\n\n>微服务相关的开源项目,直接根据 Github 讲解,三个相关的项目链接如"
  },
  {
    "path": "content/night/20-2018-11-15-go-test.md",
    "chars": 187,
    "preview": "---\ndesc: 由 genpost (https://github.com/hidevopsio/genpost) 代码生成器生成\ntitle: 第 20 期 go test 及测试覆盖率\ndate: 2018-11-15T11:19:"
  },
  {
    "path": "content/night/21-2018-11-28-errors-in-go.md",
    "chars": 197,
    "preview": "---\ndesc: 由 genpost (https://github.com/hidevopsio/genpost) 代码生成器生成\ntitle: 第 21 期 Go errors 处理及 zap 源码分析\ndate: 2018-11-2"
  },
  {
    "path": "content/night/22-2018-12-06-go-ide-discuss.md",
    "chars": 165,
    "preview": "---\ndesc: VSCode Goland Sublime Text 3 Vim\ntitle: 第 22 期 Go 开发工具讨论\ndate: 2018-12-06T20:30:00+08:00\nauthor: 杨文/John/...\n-"
  },
  {
    "path": "content/night/23-2018-12-13-drone-guide.md",
    "chars": 426,
    "preview": "---\ndesc: Drone 简单介绍和部分源码分析\ntitle: 第 23 期 Drone 简单介绍和部分源码分析\ndate: 2018-12-13T20:35:00+08:00\nauthor: 杨文\n---\n\n## 观看视频\n\n{{<"
  },
  {
    "path": "content/night/24-2018-12-23-go-mod-part-1.md",
    "chars": 10483,
    "preview": "---\ndesc: go mod 源码阅读\ntitle: 第 24 期 go mod 源码阅读 part 1\ndate: 2018-12-23T21:05:00+08:00\nauthor: 杨文\n---\n\n*Go 标准包阅读*\n\nGo 版本"
  },
  {
    "path": "content/night/25-2018-12-27-tsdb.md",
    "chars": 210,
    "preview": "---\ndesc: TSDB 引擎介绍,对比及存储细节\ntitle: 第 25 期 TSDB 引擎介绍,对比及存储细节\ndate: 2018-12-27T20:35:00+08:00\nauthor: yuyang\n---\n\n## TSDB "
  },
  {
    "path": "content/night/26-2019-01-03-blog-with-github-netlify.md",
    "chars": 225,
    "preview": "---\ndesc: 手把手教你基于 Github+Netlify 构建自动化持续集成的技术团队博客\ntitle: 第 26 期 Go 夜读之手把手教你基于 Github+Netlify 构建自动化持续集成的技术团队博客\ndate: 2019"
  },
  {
    "path": "content/night/27-2019-01-10-go-mod-part-2.md",
    "chars": 3017,
    "preview": "---\ndesc: go mod 源码阅读 part 2\ntitle: 第 27 期 Go 夜读之 go mod 源码阅读 part 2\ndate: 2019-01-10T21:05:00+08:00\nauthor: mai\n---\n\n*G"
  },
  {
    "path": "content/night/28-2019-01-17-go-mod-part-3.md",
    "chars": 695,
    "preview": "---\ndesc: go mod 源码阅读 part 3\ntitle: 第 28 期 Go 夜读之 go mod 源码阅读 part 3\ndate: 2019-01-17T20:05:00+08:00\nauthor: mai\n---\n\n*G"
  },
  {
    "path": "content/night/29-2019-01-23-opentracing-jaeger-in-go.md",
    "chars": 4215,
    "preview": "---\ndesc: Go opentracing jaeger 集成及源码分析\ntitle: 第 29 期 Go opentracing jaeger 集成及源码分析\ndate: 2019-01-23T21:00:00+08:00\nauth"
  },
  {
    "path": "content/night/3-2018-04-18-strings-part1.md",
    "chars": 2383,
    "preview": "---\ntitle: 第 3 期 2018-04-18 线下活动\ndate: 2018-04-18T11:49:10+08:00\n---\n>参与人数: 14 人\n\n*Go 标准包阅读*\n\nGo 版本:go 1.10.1\n\n### strin"
  },
  {
    "path": "content/night/30-2019-02-16-go-mod-part-4.md",
    "chars": 222,
    "preview": "---\ndesc: Go 夜读之 go mod 源码阅读 part 4\ntitle: 第 30 期 Go 夜读之 go mod 源码阅读 part 4\ndate: 2019-02-16T21:00:00+08:00\nauthor: mai\n"
  },
  {
    "path": "content/night/31-2019-02-23-flag.md",
    "chars": 755,
    "preview": "---\ndesc: Go 夜读之 flag 包源码阅读\ntitle: 第 31 期 Go 夜读之 flag 包源码阅读\ndate: 2019-02-23T21:00:00+08:00\nauthor: mai\n---\n\n*Go 标准包阅读*\n"
  },
  {
    "path": "content/night/32-2019-03-02-etcd-raft.md",
    "chars": 1384,
    "preview": "---\ndesc: Go 夜读之 etcd raft 源码阅读\ntitle: 第 32 期 Go 夜读之 etcd raft 源码阅读\ndate: 2019-03-02T21:05:00+08:00\nauthor: 缪昌新\n---\n\n*et"
  },
  {
    "path": "content/night/33-2019-03-07-defer-in-go.md",
    "chars": 173,
    "preview": "---\ndesc: Go 夜读之 Go defer 和逃逸分析\ntitle: 第 33 期 Go 夜读之 Go defer 和逃逸分析\ndate: 2019-03-07T21:05:00+08:00\nauthor: 饶全成\n---\n\n201"
  },
  {
    "path": "content/night/34-2019-03-16-plan9-guide.md",
    "chars": 6619,
    "preview": "---\ndesc: Go 夜读之 plan9 汇编入门,带你打通应用和底层 by Xargin\ntitle: 第 34 期 Go 夜读之 plan9 汇编入门,带你打通应用和底层 by Xargin\ndate: 2019-03-16T21:"
  },
  {
    "path": "content/night/35-2019-03-21-reading-context.md",
    "chars": 242,
    "preview": "---\ndesc: Go 夜读之 context 源码阅读\ntitle: 第 35 期 context 源码阅读\ndate: 2019-03-21T21:05:00+08:00\nauthor: mai\n---\n\n## 预习材料\n\n[第 35"
  },
  {
    "path": "content/night/36-2019-03-28-reading-k8s-context.md",
    "chars": 593,
    "preview": "---\ndesc: Go 夜读之 k8s context 实践源码阅读\ntitle: 第 36 期 k8s context 实践源码阅读\ndate: 2019-03-28T21:05:00+08:00\nauthor: mai\n---\n\n##"
  },
  {
    "path": "content/night/37-2019-04-01-talk-from-serverless-in-apache-pulsar.md",
    "chars": 306,
    "preview": "---\ndesc: Go 夜读之 从 serverless 的一个设计说起\ntitle: 第 37 期 从 serverless 的一个设计说起\ndate: 2019-04-01T21:05:00+08:00\nauthor: 冉小龙\n---"
  },
  {
    "path": "content/night/38-2019-04-13-k8s-scheduler-reading.md",
    "chars": 175,
    "preview": "---\ndesc: Go 夜读之 kubernetes scheduler 源码阅读\ntitle: 第 38 期 kubernetes scheduler 源码阅读\ndate: 2019-04-13T21:05:00+08:00\nautho"
  },
  {
    "path": "content/night/39-2019-04-18-init-function-in-go.md",
    "chars": 160,
    "preview": "---\ndesc: Go 夜读之 init function 使用分析\ntitle: 第 39 期 init function 使用分析\ndate: 2019-04-18T21:05:00+08:00\nauthor: mai\n---\n\n##"
  },
  {
    "path": "content/night/4-2018-04-25-strings-part2.md",
    "chars": 667,
    "preview": "---\ntitle: 第 4 期 2018-04-25 线下活动\ndate: 2018-04-25T11:49:10+08:00\n---\n>参与人数: 15 人\n\n*Go 标准包阅读*\n\nGo 版本:go 1.10.1\n\n### strin"
  },
  {
    "path": "content/night/40-2019-04-27-atomic-value-in-go.md",
    "chars": 166,
    "preview": "---\ndesc: Go 夜读之 atomic.Value 的使用和源码分析\ntitle: 第 40 期 atomic.Value 的使用和源码分析\ndate: 2019-04-27T21:05:00+08:00\nauthor: mai\n-"
  },
  {
    "path": "content/night/41-2019-05-12-golint-golangci-lint.md",
    "chars": 182,
    "preview": "---\ndesc: Go 夜读之 golint 及 golangci-lint 的介绍和使用\ntitle: 第 41 期 golint 及 golangci-lint 的介绍和使用\ndate: 2019-05-12T20:00:00+08:"
  },
  {
    "path": "content/night/42-2019-05-16-go-failpoint-design.md",
    "chars": 193,
    "preview": "---\ndesc: Go 夜读之 An Introduction to Failpoint Design\ntitle: 第 42 期 An Introduction to Failpoint Design\ndate: 2019-05-16T"
  },
  {
    "path": "content/night/43-2019-05-23-gomonkey-framework-design-and-practives.md",
    "chars": 160,
    "preview": "---\ndesc: Go 夜读之 gomonkey 框架设计与应用实践\ntitle: 第 43 期 gomonkey 框架设计与应用实践\ndate: 2019-05-23T21:30:00+08:00\nauthor: 张晓龙\n---\n\n##"
  },
  {
    "path": "content/night/44-2019-05-29-go-map-reading.md",
    "chars": 164,
    "preview": "---\ndesc: Go 夜读之 Go map 源码阅读分析(20190529第44期)\ntitle: 第 44 期 Go map 源码阅读分析\ndate: 2019-05-29T21:10:00+08:00\nauthor: 饶全成\n---"
  },
  {
    "path": "content/night/45-2019-05-30-goim-reading.md",
    "chars": 171,
    "preview": "---\ndesc: Go 夜读之 goim 架构设计与源码分析(20190530第45期)\ntitle: 第 45 期 goim 架构设计与源码分析\ndate: 2019-05-30T21:10:00+08:00\nauthor: tsing"
  },
  {
    "path": "content/night/46-2019-06-05-tidb-overview-reading.md",
    "chars": 3620,
    "preview": "---\ndesc: Go 夜读 && TiDB 源码阅读之概览\ntitle: 第 46 期 TiDB 源码阅读之概览\ndate: 2019-06-05T21:10:00+08:00\nauthor: 龙恒\n---\n\n## TiDB Sourc"
  },
  {
    "path": "content/night/47-2019-06-12-tidb-exector-reading.md",
    "chars": 1399,
    "preview": "---\ndesc: Go 夜读 && TiDB 源码阅读之 Executor\ntitle: 第 47 期 TiDB 源码阅读之 Executor\ndate: 2019-06-12T21:10:00+08:00\nauthor: chenshu"
  },
  {
    "path": "content/night/48-2019-06-19-tidb-compiler-reading.md",
    "chars": 2092,
    "preview": "---\ndesc: Go 夜读 && TiDB 源码阅读之 Compiler\ntitle: 第 48 期 TiDB 源码阅读之 Compiler\ndate: 2019-06-19T21:10:00+08:00\nauthor: wangcon"
  },
  {
    "path": "content/night/49-2019-06-26-tidb-transaction-reading.md",
    "chars": 2363,
    "preview": "---\ndesc: Go 夜读 && TiDB 源码阅读之 Transaction\ntitle: 第 49 期 TiDB 源码阅读之 Transaction\ndate: 2019-06-26T21:10:00+08:00\nauthor: z"
  },
  {
    "path": "content/night/5-2018-05-10-strings-part3.md",
    "chars": 4466,
    "preview": "---\ntitle: 第 5 期 2018-05-10 线下活动 - Go 标准包阅读\ndate: 2018-05-10T11:49:10+08:00\n---\n>参与人数: 20 人\n\n*Go 标准包阅读*\n\nGo 版本:go 1.10.1"
  },
  {
    "path": "content/night/50-2019-06-27-goland-practice.md",
    "chars": 5118,
    "preview": "---\ndesc: Go 夜读之 GoLand Tips & Tricks\ntitle: 第 50 期 Go 夜读之 GoLand Tips & Tricks\ndate: 2019-06-27T21:10:00+08:00\nauthor: "
  },
  {
    "path": "content/night/51-2019-07-18-sync-errgroup.md",
    "chars": 312,
    "preview": "---\ndesc: Go 夜读之 sync/errgroup 源码阅读\ntitle: 第 51 期 Go 夜读之 sync/errgroup 源码阅读\ndate: 2019-07-18T21:10:00+08:00\nauthor: mai\n"
  },
  {
    "path": "content/night/52-2019-07-25-httprouter-guide.md",
    "chars": 222,
    "preview": "---\ndesc: Go 夜读之 httprouter 简介\ntitle: 第 52 期 Go 夜读之 httprouter 简介\ndate: 2019-07-25T21:10:00+08:00\nauthor: 曹大\n---\n\n## htt"
  },
  {
    "path": "content/night/53-2019-08-01-build-in-delete-from-map-in-go.md",
    "chars": 1207,
    "preview": "---\ndesc: Go 夜读之 build in func delete from map\ntitle: 第 53 期 Go 夜读之 build in func delete from map\ndate: 2019-08-01T21:10"
  },
  {
    "path": "content/night/54-2019-08-14-tidb-sql-tools.md",
    "chars": 618,
    "preview": "---\ndesc: Go 夜读之 TiDB SQL 兼容性测试工具简介\ntitle: 第 54 期 Go 夜读之 TiDB SQL 兼容性测试工具简介\ndate: 2019-08-14T21:00:00+08:00\nauthor: Ping"
  },
  {
    "path": "content/night/55-2019-08-15-go-webassembly-guide.md",
    "chars": 1610,
    "preview": "---\ndesc: Go 夜读之 Go&WebAssembly 简介\ntitle: 第 55 期 Go&WebAssembly 简介\ndate: 2019-08-15T21:00:00+08:00\nauthor: 柴大\n---\n\n## Go"
  },
  {
    "path": "content/night/56-2019-08-22-channel-select-in-go.md",
    "chars": 5997,
    "preview": "---\ndesc: Go 夜读之 channel & select 源码分析\ntitle: 第 56 期 channel & select 源码分析\ndate: 2019-08-22T21:00:00+08:00\nauthor: 欧长坤\n-"
  },
  {
    "path": "content/night/57-2019-08-29-sync-semaphore.md",
    "chars": 1020,
    "preview": "---\ndesc: Go 夜读之 sync/semaphore 源码浅析\ntitle: 第 57 期 sync/semaphore 源码浅析\ndate: 2019-08-29T21:00:00+08:00\nauthor: Felix\n---"
  },
  {
    "path": "content/night/58-2019-09-05-whats-new-in-go1.13.md",
    "chars": 744,
    "preview": "---\ndesc: Go 夜读之 What's new in Go 1.13?\ntitle: 第 58 期 What's new in Go 1.13?\ndate: 2019-09-05T21:05:00+08:00\nauthor: Go "
  },
  {
    "path": "content/night/59-2019-09-12-real-world-go-concurrency-bugs-in-paper-reading.md",
    "chars": 3887,
    "preview": "---\ndesc: Go 夜读之 Real-world Go Concurrency Bugs\ntitle: 第 59 期 Real-world Go Concurrency Bugs\ndate: 2019-09-12T21:00:00+0"
  },
  {
    "path": "content/night/6-2018-05-17-strings-part4.md",
    "chars": 741,
    "preview": "---\ntitle: 第 6 期 2018-05-17 线下活动 - Go 标准包阅读\ndate: 2018-05-17T11:49:10+08:00\n---\n>参与人数: 12 人\n\n*Go 标准包阅读*\n\nGo 版本:go 1.10.1"
  },
  {
    "path": "content/night/60-2019-09-19-ipfs-guide.md",
    "chars": 1835,
    "preview": "---\ndesc: Go 夜读之 IPFS 星际文件系统\ntitle: 第 60 期 IPFS 星际文件系统\ndate: 2019-09-19T21:05:00+08:00\nauthor: xcshuan\n---\n\n## Go 夜读第 60"
  },
  {
    "path": "content/night/61-2019-09-26-go-module-goproxy-cn.md",
    "chars": 4753,
    "preview": "---\ndesc: Go 夜读 之 Go Modules、Go Module Proxy 和 goproxy.cn #468\ntitle: 第 61 期 Go Modules、Go Module Proxy 和 goproxy.cn #46"
  },
  {
    "path": "content/night/62-2019-10-10-go-micro-part1.md",
    "chars": 2304,
    "preview": "---\ndesc: Go 夜读 之 Go-Micro 微服务框架 Part 1\ntitle: 第 62 期 Go-Micro 微服务框架 Part 1\ndate: 2019-10-10T21:00:00+08:00\nauthor: prin"
  },
  {
    "path": "content/night/63-2019-10-17-go-style-and-go-advices.md",
    "chars": 3359,
    "preview": "---\ndesc: Go 夜读 之 Go 编码风格阅读与讨论\ntitle: 第 63 期 Go 编码风格阅读与讨论\ndate: 2019-10-17T21:00:00+08:00\nauthor: mai\n---\n\n## Go 夜读第 63 "
  },
  {
    "path": "content/night/64-2019-10-24-go-runtime.md",
    "chars": 2785,
    "preview": "---\ndesc: Go 夜读之深入浅出 Golang Runtime\ntitle: 第 64 期深入浅出 Golang Runtime\ndate: 2019-10-24T21:00:00+08:00\nauthor: 郝以奋@腾讯NOW直播"
  },
  {
    "path": "content/night/65-2019-10-31-go-net.md",
    "chars": 5948,
    "preview": "---\ndesc: Go 夜读之 Go 网络编程:Go 原生同步网络模型解析 vs Multi-Reactors 异步网络模型\ntitle: 第 65 期 Go 原生网络模型 vs 异步 Reactor 模型\ndate: 2019-10-3"
  },
  {
    "path": "content/night/66-2019-11-07-paper-reading-csp.md",
    "chars": 1381,
    "preview": "---\ndesc: Go 夜读之 Paper Reading CSP 理解顺序进程间通信\ntitle: 第 66 期 Paper Reading CSP 理解顺序进程间通信\ndate: 2019-11-07T21:00:00+08:00\na"
  },
  {
    "path": "content/night/67-2019-11-14-sql-pool-reading.md",
    "chars": 1453,
    "preview": "---\ndesc: Go 夜读之 Go database/sql 数据库连接池分析\ntitle: 第 67 期 Go database/sql 数据库连接池分析\ndate: 2019-11-14T21:00:00+08:00\nauthor:"
  },
  {
    "path": "content/night/68-2019-11-21-dive-into-network.md",
    "chars": 4598,
    "preview": "---\ndesc: Go 夜读之网络知识十全大补丸\ntitle: 第 68 期网络知识十全大补丸\ndate: 2019-11-21T21:00:00+08:00\nauthor: 刘楠\n---\n\n## Go 夜读第 68 期网络知识十全大补丸"
  },
  {
    "path": "content/night/69-2019-11-28-devops.md",
    "chars": 545,
    "preview": "---\ndesc: Go 夜读之基于 Go 语言周边生态打造的行业技术中台\ntitle: 第 69 期 DevOps 实践之路 - 基于 Go 语言周边生态打造的行业技术中台\ndate: 2019-11-28T21:00:00+08:00\n"
  },
  {
    "path": "content/night/7-2018-05-24-net-http-part1.md",
    "chars": 7307,
    "preview": "---\ntitle: 第 7 期 2018-05-24 线下活动 - Go 标准包阅读\ndate: 2018-05-24T11:49:10+08:00\n---\n>参与人数: 10 人\n\n*Go 标准包阅读*\n\nGo 版本:go 1.10.1"
  },
  {
    "path": "content/night/70-2019-12-05-go-details.md",
    "chars": 633,
    "preview": "---\ndesc: Go 夜读之 Go 中不常注意的各种细节集锦\ntitle: 第 70 期 Go 中不常注意的各种细节集锦\ndate: 2019-12-05T21:00:00+08:00\nauthor: 老貘@Golang101作者\n--"
  }
]

// ... and 123 more files (download for full content)

About this extraction

This page contains the full source code of the talkgo/night GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 323 files (1.0 MB), approximately 410.4k tokens, and a symbol index with 193 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!