這裡記錄每周值得分享的 Go 語言相關內容,周日發布。
本周刊開源(GitHub:polaris1119/golangweekly[1]),歡迎投稿,推薦或自薦文章/軟體/資源等,請提交 issue[2] 。
由於頭條不允許外鏈,請通過文末的「了解更多」來方便的點擊外鏈。
鑒於大部分人可能沒法堅持把英文文章看完,因此,周刊中會儘可能推薦優質的中文文章。優秀的英文文章,我們的 GCTT 組織會進行翻譯。
(題圖:來自網絡)
刊首語
周刊每次整理花費很多時間,但可能依然有很多好內容沒有列出來,所以如果您有好內容記得給我們投稿。另外,Go語言中文網微信公眾號也支持投稿,如果你有公眾號,歡迎給我們開白名單,也可以聯繫我們,微信:polaris_6196 。
資訊
1、Kubernetes 1.16.0 發布,新版本四大主題[3]
該版本由 31 個增強功能組成:8 個進入穩定,8 個進入 Beta,15 個進入 Alpha。完整內容:https://kubernetes.io/blog/2019/09/18/kubernetes-1-16-release-announcement/ 。
Kubernetes 1.16 發布,一文讀懂其重磅新特性[4]
2、TinyGo 0.8 發布[5]
這是一個基於 LLVM 的、用於一些特定小場景的 Go 編譯器,比如 WebAssembly、Microcontrollers 和 命令行工具等。在周刊的第 1 期推薦過。這次版本主要提升了反射性能、擴展和提升調度器性能等。
3、GoLab: 義大利 Go 大會 (10 月 20 - 22 日)[6]
GoLab 將在佛羅倫斯的 Mediterraneo 大酒店舉行。
4、FastHTTP 1.5 發布[7]
Go 快速的 HTTP 包。為高性能而調優。 熱路徑中的零內存分配。 比 net/http 快 10 倍。有興趣可以研究為什麼能做到快這麼多。
5、Traefik 2.0:強大的雲原生邊緣路由器[8]
一個開放原始碼的反向代理和負載平衡器,用於基於 HTTP 和 TCP 的應用程式,它簡單,動態,自動,快速,功能齊全,經過生產驗證,提供指標並與每種主要的集群技術集成……難怪如此流行!官網:https://traefik.io/ ,項目地址:https://github.com/containous/traefik
6、vim-go 1.21 發布[9]
感覺 vim-go、gopls 和 coc.nvim 組合應該是目前使用 vim 編寫 go 代碼的最佳組合了。開發效率高,並且也沒感覺占用太多資源。當然,vim 要掌握還是不容易的。
7、Caddy 2.0 beta 2 發布[10]
Caddy 2.0 beta 2 是 Caddy 2 開發周期中的下一個預發布版本。
問答
1、為什麼 go 的 map 數據競爭是 fatal 錯誤, 而不是 panic?[11]
1)首先為什麼要fatal?
2)為什麼是fatal而不是panic?
請從源碼層面的原因是什麼或者從源碼解釋,每一個回答都忠誠感謝!
2、Go 的接口繼承如何正確的應用?[12]
遇到了一個關於go接口繼承問題,希望可以得到大家的解答。
3、os.open竟然在文件不存在時返回err==nil,虧我那麼信任它[13]
撞到了 「Windows中不能用con等作為文件名」這個坑。
4、golang與C語言相比最重要的改進是什麼?[14]
你認為是哪些?
5、golang第三方庫fasthttp為什麼要使用slice而不是map來存儲header?[15]
fasthttp的作者在一個gopher會上的ppt,作者提到在fasthttp中使用了slice而不是map來存儲header,query參數和cookie。不太理解為什麼這樣就可以re-use memory,是因為如果返回是string的話需要內存的拷貝嗎?還有這個Add方法與直接append有什麼區別呢?
6、context包的withTimeout, withCancel之類的具體實用價值是啥[16]
可能也有其他人有此困惑。
7、golang有沒有類似py的netifaces包來獲取某個網卡的網關,MAC,子網掩碼等信息的第三方庫?[17]
golang的net可以獲取ip,掩碼,貌似也可以獲取mac。那怎麼獲取網關地址,或者有沒有別的類似的第三方庫? 現在目的就是想要根據網卡名字比如eth1,獲取該網卡的ip地址,子網掩碼,物理地址,網關,DNS。
8、How to scan an interface into a struct?[18](英文)
使用非 ORM 會常遇到。
文章
1、使用 Goland 進行調試
GCTT 翻譯的三篇 Goland 進行調試的文章,起步、要點、動態調試。
2、「校招季」這幾個開源項目助力你拿到好 Offer
一年有兩個重要的招聘時間:金三銀四和金九銀十。而金九銀十主要針對校招(秋招)。另一方面,AI 真是火的一塌糊塗,如果你對此感興趣,希望將來從事這方面的工作,本文列出的項目值得收藏學習。
3、我是如何學習 Go 語言的
本文是前滴滴、現阿里雲技術專家總結的如何學習 Go 語言。另附一篇我的 Go 語言學習之路。
4、Go 語言包管理簡史[19]
包管理是 Go 一直被詬病做得不好的功能之一。Go team 近幾年在這方面投入了巨大精力,實現了從 vendor 機制到完善的Go module。本文簡短介紹一下 Go 包管理的發展史。
5、看看這篇拯救髮際線的乾貨吧--警惕 Go 編程陷阱
主要給大家分享我這幾年以來所積累的一些讓我非常難受地方以及感到崩潰的一些 BUG,我希望我的這些痛苦可以讓大家快樂,當然我也希望我積累的這些經驗以及案例可以拯救大家一些睡眠的時間,讓我們有更多的時間去浪,去玩耍。
6、go 學習筆記之學習函數式編程前不要忘了函數基礎
在編程世界中向來就沒有一家獨大的編程風格,至少目前還是百家爭鳴的春秋戰國,除了眾所周知的面向對象編程還有日漸流行的函數式編程。本文開始介紹函數式編程之函數基礎。
7、譯:Google 官方文章——如何去做code review[20]
Google 前幾天公開了一篇谷歌的工程實踐文檔。而且文檔的內容都是跟 code review 相關的內容,裡面包含了 Google 工程師如何進行 code review 的內容,以及 code review 指南。
8、golang 優雅的錯誤處理[21]
golang的錯誤處理一直深受大家詬病,項目裡面一半的代碼在做錯誤處理。
自己在做golang開發一段時間後,也深有同感,覺得很有必要優化一下,一方面讓代碼更優雅一些,另一方面也為了形成系統的錯誤處理方式,而不是隨心所欲的來個errors.new(),或者一直return err。
在查閱一些資料之後,發現自己對golang錯誤處理的認識,還停留在一個低階的層面上。這裡想和大家探討一下,也為鞏固自己所學。
9、Golang error 的突圍
Go 語言使用 error 和 panic 處理錯誤和異常是一個非常好的做法,比較清晰。至於是使用 error 還是 panic,看具體的業務場景。
本文還列舉了一些處理 error 的示例,例如不要兩次處理一個錯誤,判斷錯誤的行為而不是類型等等。
10、Go 微服務全鏈路跟蹤詳解[22]
在微服務架構中,調用鏈是漫長而複雜的,要了解其中的每個環節及其性能,你需要全鏈路跟蹤。它的原理很簡單,你可以在每個請求開始時生成一個唯一的 ID,並將其傳遞到整個調用鏈。 該 ID 稱為 CorrelationID[23]¹,你可以用它來跟蹤整個請求並獲得各個調用環節的性能指標。簡單來說有兩個問題需要解決。第一,如何在應用程式內部傳遞ID; 第二,當你需要調用另一個微服務時,如何通過網絡傳遞ID。本文講解 Go 微服務全鏈路跟蹤詳解。
11、為什麼說容器是單進程模型
Go 語言現在的一個主要應用領域就是雲原生技術,包括容器(以 Docker 為代表)、Kubernetes、Prometheus 等。後面將寫一系列文章來介紹一下雲原生技術棧中的關鍵技術。
12、如何靈活地進行 Go 版本管理
本文談下我對 Go 版本管理的一些思考,並給大家介紹一個小工具,gvm。這個工具不支持 Windows,可以試試 https://github.com/voidint/g 。
開源項目
1、Mage: 一個類似 Makefile 的構建工具[24]
Mage 是使用 Go 的類似 make/rake 的構建工具。您編寫普通的 go 函數,Mage 會自動將它們用作類似於 Makefile 的可運行目標。
2、gnet: 用純 Go 編寫的高性能,輕量級,無阻塞和事件循環網絡庫[25]
gnet是一個基於 Event-Loop 事件驅動的高性能和輕量級網絡庫。這個庫直接使用 epoll[26]和 kqueue[27]系統調用而非標準 Golang 網絡包:net[28] 來構建網絡應用,它的工作原理類似兩個開源的網絡庫:libuv[29] 和 libevent[30]。
gnet 是國人開發的,衍生自另一個項目:evio[31],號稱性能更好。中文說明文檔:https://github.com/panjf2000/gnet/blob/master/README_ZH.md
3、TurboCookedRabbit:Go 編寫的用戶友好型 RabbitMQ 庫[32]
使用 RabbitMQ 的可以試試,項目提供了各種示例。
4、pflag: 實現 POSIX/GNU 樣式的命令行參數[33]
cobra[34] 這個項目就用了 pflag。
5、lpn: 讓運行 Docker 鏡像更容易[35]
Liferay Portal Nook(lpn)一種快速靈活的 CLI,用於管理 Liferay Portal 的 Docker 映像。
6、brook: 一個跨平台的 代理/vpn 軟體[36]
Go 語言實現的類似開源項目有很多,目前該項目近 1w star。它支持 Linux/MacOS/Windows/Android/iOS 。Brook的目標是保持簡單、傻瓜且不容易檢測。
7、loki: 類似 Prometheus 但用於日誌[37]
Grafana 100% 開源的項目,優化查詢,方便導出到 Grafana 中進行可視化展示。
8、zerolog: 零分配的 JSON 格式日誌庫[38]
該包提供了專用於 JSON 輸出的快速簡單的記錄器。使用它的項目或公司這裡可查[39]。
9、Ristretto: Dgraph 發布高性能 cache 系統[40]
Ristretto 是使用 TinyLFU[41] 准入策略和 Sampled LFU 逐出策略的快速並發緩存庫。在項目中,有相關的性能測試,通過性能測試對比,可以了解到目前有哪些主要的 Go 語言實現的緩存庫。
關於該庫的官方介紹,參考該文[42]。
10、xray: 一款功能強大的安全評估工具[43]
支持掃描 XSS、SQL、代碼注入等一系列漏洞。
11、gowitness: Go 實現的使用 Chrome Headless 的網站截圖工具[44]
gowitness 是用 Golang 編寫的網站螢幕截圖實用程序,它使用 Chrome Headless 通過命令行生成 Web 介面的螢幕截圖。 Linux 和 macOS 均受支持,而 Windows 「部分支持」。
資源&&工具
1、Go 設計模式,儘可能採用 Go 的風格實現[45](英文)
目前實現了大部分的設計模式。同時分享一份國人用 Go 實現的設計模式:https://github.com/sevenelevenlee/go-patterns
2、學習區塊鏈編程的資源列表[46](英文)
這是精選的閱讀材料和資源清單,激發了我們對實現未來的去中心化公鑰基礎結構(PKI)願景的興趣。
3、開源電子書 pure bash bible[47](英文)
本書的目的是記錄僅使用內置 bash 功能執行各種任務的常用方法和鮮為人知的方法。
4、Kubernetes 安全指南[48](英文)
安全是不容忽視的。
5、論文:Go-Sanitizer 為 Go 語言開發的面向 bug 的斷言生成器[49](英文)
使用 Go-sanitizer 對開源的 Badge r項目進行分析,發現了 12 個之前並未報告的 bug。
6、arduino-cli: arduino 官方提供的命令行接口工具[50]
該工具提供一體化解決方案,提供構建器,電路板/庫管理器,上傳器,發現和使用任何 Arduino 兼容板和平台所需的許多其他工具。它使用 Go 語言實現,是 Go 在嵌入式領域的又一重大且有影響力的應用。
記得上期周刊還有人說 Go 沒法做嵌入式開發,現在呢?
7、獨立開發者如何賺錢?[51](英文)
總結了一些賺錢的方式。
8、git pull --rebase 的正確使用[52]
rebase 不容易掌握,但在多人合作開發中卻是很重要的,本文詳解 git pull --rebase 的使用。
訂閱
這個周刊每周日發布,同步更新在Go語言中文網[53]、微信公眾號[54] 和 今日頭條[55]。
微信搜索"Go語言中文網"或者掃描二維碼,即可訂閱。
參考資料
[1]
polaris1119/golangweekly: https://github.com/polaris1119/golangweekly
[2]
提交 issue: https://github.com/polaris1119/golangweekly/issues
[3]
Kubernetes 1.16.0 發布,新版本四大主題: https://www.oschina.net/news/109996/kubernetes-1-16-0-released
[4]
Kubernetes 1.16 發布,一文讀懂其重磅新特性: http://toutiao.com/item/6739110374945063438/
[5]
TinyGo 0.8 發布: https://github.com/tinygo-org/tinygo/releases/tag/v0.8.0
[6]
GoLab: 義大利 Go 大會 (10 月 20 - 22 日): https://golab.io/
[7]
FastHTTP 1.5 發布: https://github.com/valyala/fasthttp
[8]
Traefik 2.0:強大的雲原生邊緣路由器: https://blog.containo.us/traefik-2-0-6531ec5196c2
[9]
vim-go 1.21 發布: https://github.com/fatih/vim-go/releases/tag/v1.21
[10]
Caddy 2.0 beta 2 發布: https://github.com/caddyserver/caddy/releases/tag/v2.0.0-beta2
[11]
為什麼 go 的 map 數據競爭是 fatal 錯誤, 而不是 panic?: https://www.zhihu.com/question/305845656
[12]
Go 的接口繼承如何正確的應用?: https://www.zhihu.com/question/328762850/answer/712332485
[13]
os.open竟然在文件不存在時返回err==nil,虧我那麼信任它: https://studygolang.com/topics/10068
[14]
golang與C語言相比最重要的改進是什麼?: https://www.zhihu.com/question/325945059/answer/695652418
[15]
golang第三方庫fasthttp為什麼要使用slice而不是map來存儲header?: https://www.zhihu.com/question/327580797/answer/705124669
[16]
context包的withTimeout, withCancel之類的具體實用價值是啥: https://segmentfault.com/q/1010000020382614
[17]
golang有沒有類似py的netifaces包來獲取某個網卡的網關,MAC,子網掩碼等信息的第三方庫?: https://segmentfault.com/q/1010000013840078
[18]
How to scan an interface into a struct?: https://www.reddit.com/r/golang/comments/d6fd4x/how_to_scan_an_interface_into_a_struct/
[19]
Go 語言包管理簡史: https://tonybai.com/2019/09/21/brief-history-of-go-package-management/
[20]
譯:Google 官方文章——如何去做code review: https://juejin.im/post/5d80c27cf265da03e61b45c7
[21]
golang 優雅的錯誤處理: https://segmentfault.com/a/1190000020420692
[22]
Go 微服務全鏈路跟蹤詳解: https://segmentfault.com/a/1190000020450845
[23]
CorrelationID: https://hilton.org.uk/blog/microservices-correlation-id
[24]
Mage: 一個類似 Makefile 的構建工具: https://github.com/magefile/mage
[25]
gnet: 用純 Go 編寫的高性能,輕量級,無阻塞和事件循環網絡庫: https://github.com/panjf2000/gnet
[26]
epoll: https://en.wikipedia.org/wiki/Epoll
[27]
kqueue: https://en.wikipedia.org/wiki/Kqueue
[28]
net: https://golang.org/pkg/net/
[29]
libuv: https://github.com/libuv/libuv
[30]
libevent: https://github.com/libevent/libevent
[31]
evio: https://github.com/tidwall/evio
[32]
TurboCookedRabbit:Go 編寫的用戶友好型 RabbitMQ 庫: https://github.com/houseofcat/turbocookedrabbit
[33]
pflag: 實現 POSIX/GNU 樣式的命令行參數: https://github.com/spf13/pflag
[34]
cobra: https://github.com/spf13/cobra
[35]
lpn: 讓運行 Docker 鏡像更容易: https://mdelapenya.github.io/lpn/index.html
[36]
brook: 一個跨平台的 代理/vpn 軟體: https://github.com/txthinking/brook
[37]
loki: 類似 Prometheus 但用於日誌: https://github.com/grafana/loki
[38]
zerolog: 零分配的 JSON 格式日誌庫: https://github.com/rs/zerolog
[39]
這裡可查: https://github.com/rs/zerolog/wiki/Who-uses-zerolog
[40]
Ristretto: Dgraph 發布高性能 cache 系統: https://github.com/dgraph-io/ristretto
[41]
TinyLFU: https://arxiv.org/abs/1512.00727
[42]
參考該文: https://blog.dgraph.io/post/introducing-ristretto-high-perf-go-cache/
[43]
xray: 一款功能強大的安全評估工具: https://github.com/chaitin/xray
[44]
gowitness: Go 實現的使用 Chrome Headless 的網站截圖工具: https://github.com/sensepost/gowitness
[45]
Go 設計模式,儘可能採用 Go 的風格實現: https://github.com/tmrts/go-patterns
[46]
學習區塊鏈編程的資源列表: https://diode.io/blockchain/Best-Resources-to-Learn-Web3-Blockchain-Decentralized-PKI-and-Ethereum-19262/
[47]
開源電子書 pure bash bible: https://github.com/dylanaraps/pure-bash-bible
[48]
Kubernetes 安全指南: https://security.stackrox.com/rs/219-UEH-533/images/Definitive-guide-to-kubernetes-security.pdf
[49]
論文:Go-Sanitizer 為 Go 語言開發的面向 bug 的斷言生成器: http://www.wingtecher.com/themes/WingTecherResearch/assets/papers/issre19_go.pdf
[50]
arduino-cli: arduino 官方提供的命令行接口工具: https://github.com/arduino/arduino-cli
[51]
獨立開發者如何賺錢?: https://github.com/mezod/awesome-indie
[52]
git pull --rebase 的正確使用: https://juejin.im/post/5d3685146fb9a07ed064f11b
[53]
Go語言中文網: https://studygolang.com/go/weekly
[54]
微信公眾號: https://weixin.sogou.com/weixin?query=Go%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91
[55]
今日頭條: https://www.toutiao.com/c/user/59903081459/#mid=1586087918877709