Go Wiki: 經驗報告
此頁面收集有關 Go 遇到的問題的經驗報告,以便為這些問題的解決方案設計提供參考。這些報告應側重於問題:不必側重於或無需提出解決方案。要提出解決方案,請參閱提案流程。
我們希望透過這些經驗報告來了解人們在編寫 Go 時遇到的困難,以幫助我們確定 Go 生態系統的未來改進的優先順序。(我們不承諾回覆這些報告。如果您需要關於 Go 的即時幫助,請參閱https://golang.org.tw/help/獲取資源。)
最好的經驗報告應該說明:(1)您想做什麼,(2)您實際做了什麼,以及(3)為什麼這不好,並用真實的具體例子來說明,最好是生產環境中的例子。請寫下對您來說最重要的問題的報告,釋出在您自己的部落格、Medium 或作為GitHub Gist(使用 .md
擴充套件名錶示 Markdown),或作為公開可讀的 Google 文件,然後在此處連結它們。(訪談影片或幻燈片也受歡迎,儘管它們不太方便我們消化。)
如果您無權編輯 wiki 以將文章新增到此列表,請提交一個 issue。
請保持頁面整體按部分(例如,“錯誤處理”在“日誌記錄”之前)字母順序排序。在一個部分內,請按時間順序排列文章。包含每篇文章要點的單句摘要會很有幫助。
根據需要新增新章節。
目錄
- 應用和遊戲開發
- 併發
- 型別轉換
- Context
- 宣告
- 依賴
- 文件
- 診斷和除錯
- 教育和教學
- 錯誤處理
- 錯誤值
- 檔案系統
- 泛型
- GoMobile
- 不變性
- 程序間通訊
- 大規模軟體開發
- 字面量
- 日誌記錄
- 雜項/多項
- 模組
- 效能
- 移植
- 切片
- 語法
- 時間
- 工具鏈
- 型別系統
- 型別化的 nil
- Vendoring(供應商化)
應用和遊戲開發
- Paul Ruest,“Go 庫對應用和遊戲的支援”,2017 年 11 月
- Tad Vizbaras,“在 Go 中構建光學字元識別 (OCR)”,2017 年 12 月
型別轉換
- Richard Warburton,“當底層資料結構相同時,是否應允許 Go 型別轉換?”,2017 年 12 月
併發
- Sergey Kamardin,“一百萬個 WebSocket 和 Go”,2017 年 8 月,關於阻塞讀/寫 goroutine 的記憶體開銷。
- Nathaniel J. Smith,“關於結構化併發的筆記,或:Go 語句被認為是有害的”,2018 年 4 月。
Context
- Sam Vilain,“使用 Go 的 context 庫讓您的日誌更有意義”,2016 年 12 月,關於從 context 中提取結構化日誌值。
- Jon Calhoun,“context 值陷阱及其在 Go 中的避免或緩解方法”,2017 年 2 月。
- Michal Štrba,“context 應該在 Go 2 中消失”,2017 年 8 月
- Axel Wagner,“為什麼 context.Value 很重要以及如何改進它”,2017 年 8 月。
- Dave Cheney,“Context 不是用於取消”,2017 年 8 月。
- Ross Light,“在 Go Cap’n Proto 中取消 I/O”,2018 年 1 月。
- Iman Tumorang,“避免 Golang API 中的記憶體洩漏”,2018 年 1 月。
宣告
- Christophe Meessen,“Go 的簡短宣告 := 的問題”,2017 年 7 月,關於變數遮蔽陷阱和
:=
的明顯不一致性。 - Brian Will,“Go 的 := 語法在使用多個目標變數時容易出錯”,2017 年 8 月。
依賴
- Patrick Bohan,“Docker => Moby: Go 依賴”,2017 年 6 月 28 日。一個新 Go 團隊在依賴管理方面的掙扎以及一種應對方法。
- Judson Lester,“[未命名的 gist] (https://gist.github.com/nyarly/edb6b7a5e3a762da6a5e2da8f59acf07)”,2017 年 8 月。
- David Collier-Brown,“透過回收 Multics 的答案來避免 NP 完全問題”,2018 年 9 月。
- Adrian Hesketh “安全漏洞跟蹤”,2018 年 1 月。向安全審計員證明程式碼不包含已知漏洞。
診斷和除錯
-
Kevin Burke,“我如何執行基準測試並列印結果”,如果不需要那麼多 Unix 粘合程式碼來執行和列印這些結果就好了。2017 年 7 月。
-
John Clarke,跟蹤間歇性故障(非競爭)透過執行非常緩慢的 {命中測試失敗,增加日誌記錄} 迴圈,透過連續執行“do { go test -race } while ( $LASTEXITCODE -eq 0 )}”過夜。持續許多個晚上。像https://rr-project.org/這樣的執行跟蹤功能將具有變革性。2018 年 11 月。
-
guanw
,cmd/trace
和 PySnooper。比較cmd/trace
和一個(更簡潔的)Python 跟蹤 API。2019 年 5 月。
文件
- Kevin Burke,“需要在三個不同的地方為二進位制檔案新增文件”,2017 年 5 月。
教育和教學
- Carl Kingsford 和 Phillip Compeau,“Go 2.0 用於教學”。在入門級程式設計課程中使用 Go 的經驗。
錯誤處理
(本節是關於編寫 if err != nil
。)
- Andrew Gerrand,“錯誤處理和 Go”,2011 年 7 月,展示了 Go 的錯誤處理模式。
- Martin Sústrik,“我為什麼應該用 C 編寫 ZeroMQ,而不是 C++(第一部分)”,2012 年 5 月,討論了 C++ 異常處理的生產問題,因為錯誤處理程式碼遠離導致錯誤的錯誤程式碼。
- Thomi Richards,“錯誤的麻煩”,2014 年 3 月,認為程式碼準確記錄其返回的錯誤/可能丟擲的異常至關重要。
- Roger Peppe,“熱愛您的錯誤”,2015 年 3 月,討論了錯誤處理的慣用法。
- Bleve,“延遲清理、檢查錯誤和潛在問題”,2015 年 9 月,展示了 Bleve 搜尋中與錯誤處理和 defer 相關的 bug。
- Andrew Morgan,“我為什麼不喜歡 Go 中的錯誤處理,以及如何解決它”,2017 年 1 月,關於強制執行良好的錯誤處理很困難,錯誤沒有堆疊跟蹤,並且錯誤處理過於冗長。
- André Hänsel,“如果我來做我自己的 Go…”,2017 年 8 月
- Peter Goetz,“思考 Go 2 中的新錯誤處理方式”,2017 年 9 月,展示了 Go 中錯誤處理的易錯性,並概述了改進體驗的要求。
錯誤值
(本節是關於除了 Error() string
方法之外的其他錯誤語義。)
- Andrew Morgan,“我為什麼不喜歡 Go 中的錯誤處理,以及如何解決它”,2017 年 1 月,關於強制執行良好的錯誤處理很困難,錯誤沒有堆疊跟蹤,並且錯誤處理過於冗長。
- Chris Siebenmann,“Go 的 net 包沒有不透明的錯誤,只有未記錄的錯誤”,2018 年 8 月
- Bryan C. Mills,“Go 中的錯誤包裝和冗餘”,2019 年 9 月
檔案系統
- Chris Lewis,“非本地檔案系統應得到支援”,2017 年 7 月。建議將檔案系統讀取呼叫替換為更抽象的東西,如
sql
包所做的那樣。
泛型
- “Go 泛型討論摘要(生活文件)”。
- Bouke van der Bijl,“Go 中的慣用泛型”,2014 年 9 月。
- Craig Weber,“在 Go 中不使用泛型生活”,2014 年 12 月。
- Shashank Sharma,“Golang (Go) 中的廉價泛型”,2016 年 5 月。
- Niek Sanders,“Go 泛型排序的開銷”,2016 年 9 月,記錄了使用 sort.Interface 而不是專用程式碼進行排序的開銷。
- Jon Calhoun,“使用程式碼生成在 Go 中無需泛型生存”,2017 年 5 月。
- Jon Bodner,“閉包是 Go 的泛型”,2017 年 6 月。
- Andrew Stock,“為什麼我想念 Go 中的泛型”,2017 年 6 月
- Kevin Burke,“大量介面轉換的程式碼示例”,需要大量樣板程式碼/轉換。
- Ian Lance Taylor,“append 函式”,2017 年 7 月。
- DeedleFake,“介面的問題”,2017 年 7 月。
- Kurtis Nusbaum “我為什麼對 Go 如此沮喪”,2017 年 6 月
- Juan Álvarez,“Go 標準庫上的泛型”,2017 年 7 月。
- David Chase,“Go 泛型在 Go 編譯器中的用例”,2017 年 8 月
- Varun Kumar,“泛型 - 我希望你在這裡…”,2017 年 8 月
- Sameer Ajmani,“Go 泛型經驗報告:Google metrics API”,2017 年 8 月
- Chewxy,“Tensor Refactor:Go 經驗報告”,2017 年 9 月,討論了缺乏泛型及其對構建高效能多維陣列(需要大量指標處理和手動跟蹤型別和執行時型別檢查)的影響。
- qwerty2501,“由於缺乏泛型導致的執行時錯誤”,2017 年 10 月
- posener,“我為什麼推薦避免使用 go-kit 庫”,明確的關注點分離需要大量樣板程式碼。gokit 嘗試程式碼生成來避免這個問題 #70 #308 protoc-gen-gokit,但它看起來是一個複雜的解決方案。
- Xavier Leroy,“一個模組化的模組系統”,關於泛型模組描述的論文。
- Tobias Gustafsson,“實現 PEDS 的經驗”,PEDS 是一組靜態型別安全、不可變/永續性的集合。2017 年 11 月
- 一位谷歌員工 “govisor/generics.go”。2018 年 4 月 27 日
GoMobile
- Vijay,“[在 gomobile 中不支援巢狀結構體和切片]”
不變性
- Kurtis Nusbaum “我為什麼對 Go 如此沮喪”,2017 年 6 月
- Sindre Myren “Go 2.0:透過權衡特性來保持簡潔” 2017 年 7 月
- Tobias Gustafsson,“實現 PEDS 的經驗”,PEDS 是一組靜態型別安全、不可變/永續性的集合。2017 年 11 月
程序間通訊
- Pablo R. Larraondo “Go 程序間通訊模型”,2017 年 8 月
大規模軟體開發
- Russ Cox,“程式碼庫重構(在 Go 的幫助下)”,2016 年 11 月,概述了類型別名(#18130)部分解決的漸進式程式碼修復問題。
- Travis Jeffery,“我寧願選擇 pkg 而不是 internal”,2019 年 11 月;討論 Go 專案佈局、internal 的問題以及人們為什麼使用 pkg。
字面量
- Mike Schinkel,“管理字串字面量是一件麻煩事,不僅在 GoLang 中,在(所有?)其他語言中也是如此”,2022 年 6 月,提出“字串字面量”和“模板字面量”型別。
日誌記錄
- Evan Miller,“日誌記錄可能很棘手”,2014 年 9 月,展示了日誌記錄如何增加應用程式的尾部延遲。
- Dave Cheney,“讓我們談談日誌記錄”,2015 年 11 月,認為只有兩個日誌級別。
- TJ Holowaychuk,“Apex log”,2016 年 1 月,描述了一個結構化日誌包及其在生產中的用法。
- Paddy Foran,“Go 中的日誌記錄”,2016 年 2 月,展示瞭如何將 Go 程式日誌傳送到 Sentry。
- Martin Angers,“關於 Go 可重用包的日誌記錄”,2016 年 3 月,提出如何編寫不假定特定日誌包的程式碼的建議。
- BugReplay.com,“如何將 Google Cloud 的免費結構化日誌服務與 Golang 結合使用”,2016 年 9 月。
- Sam Vilain,“使用 Go 的 context 庫讓您的日誌更有意義”,2016 年 12 月,關於從 context 中提取結構化日誌值。
- Logmatic,“我們的 Golang 日誌世界指南”,2017 年 3 月。
- Chris Hines, Peter Bourgon,“提案:標準 Logger 介面,“2017 年 2 月,與標準庫 logger 相關的問題,尤其是在庫的上下文中,以及一個提出的解決方案。
- Sindre Myren,“log.Fatal 毫無 Go 特色” 2017 年 8 月,log.Fatal 與 defer 的不相容性,以及在 Go 1.x 和 Go 2.x 中處理它的簡單模式。
- Joonas Loppi,“修復 Go 日誌混亂的一個想法” 2017 年 12 月,只需將 *log.Logger 用作所有地方的介面,並圍繞它組合解決方案。
雜項 / 多項
- Iman Tumorang,“在 Golang 上嘗試乾淨架構” 2017 年 7 月
- Laurent Demailly,“我的 Go 語言經驗,第一部分” 2017 年 12 月,來自經驗豐富的 C/C++/Java/指令碼語言開發者的角度對當前 Go 的優缺點進行了詳細分析。
- Gokcehan Kara,“使用 Go 語言安裝可以更簡單” 2018 年 5 月,關於靜態剝離二進位制檔案安裝和分發帶版本資訊的一些複雜性。
- Bob Nystrom,“我希望 Go 是的那種語言” 2010 年 10 月,我希望 Go 有元組、聯合體、建構函式、沒有 Nil、異常、泛型、一些語法糖,以及能從鼻子裡噴出 Cheez Whiz 的小馬。
模組
- Paul Jolly - “在現有模組中建立子模組” - 涵蓋多模組儲存庫、迴圈模組依賴以及在各種“狀態”之間移動所需的步驟。
- Chi 作者 - GitHub 評論 - 關於 Chi 作者為何推遲實現 Go Modules 支援(此後已新增)。TL;DR — 由於匯入相容性規則。
- Sam Whited -"支援 Go Modules" - 從升級 20 多個模組中學到的東西。TL;DR — 將大型模組升級到 v1 以上非常痛苦,需要工具支援,模組的失敗模式非常複雜,並且很容易搞砸為現有專案新增模組支援。
- Stripe GitHub 執行緒(向下連結的評論) - 撤銷對 Go Modules 的支援。TL;DR — Stripe 正在撤銷 Go Modules 支援,因為對於 v1 以上的模組,沒有明確的從 dep 升級路徑。
- 在
GOPATH
中引用 bash 指令碼 - Badger 和 Dgraph 上的 Go Modules。TL;DR - Dgraph 正在放棄對 v2 的支援,因為它強制非 Go Modules 使用者更改他們的程式碼。
- 關於 Golang 依賴管理模式(GOPATH 和 Go Modules)的調查:現狀、問題和挑戰。- 本報告的目的是幫助開發人員更好地理解從 GOPATH 過渡到 Go Modules 的問題。
效能
- Kevin Burke,“真實生活中的 Go 基準測試”,試圖向普通開發人員解釋如何使用 pprof 等工具,也許這可以更簡單。2016 年 7 月。
- Nathan Kerr,“併發更慢?”,展示瞭如何使用 Go 的測試、基準測試和效能分析工具來提高函式併發實現的效能。2017 年 4 月。
移植
- Shannon Pekary,“為什麼選擇 GOPP”,試圖建立一個“class”關鍵字,它只是將一個 struct 也變成一個 interface,從而使從面嚮物件語言移植程式碼更加容易。
切片
- Richard Warburton,“Go 2.0 是否應支援切片比較?”,主張將切片視為結構體進行相等性比較,忽略底層陣列。
- “去重切片過於麻煩”,您的原始碼中的一個 10 行函式,相比例如 Ruby 的
uniq
函式。 - “Go 可變函式的反直覺行為”,2018 年 1 月,在將切片擴充套件到引數列表時遇到的障礙。
語法
- André Hänsel,“如果我來做我自己的 Go…”,2017 年 8 月
- Bojan Zivanovic,“可選函式引數”,2020 年 5 月
- Raanan Hadar,“一位資料科學家的 Go 觀點”,2020 年 9 月
時間
- John Graham-Cumming,“閏秒如何以及為何影響了 Cloudflare DNS”,2017 年 1 月,關於閏秒的計時(#12914)。
工具鏈
- Jonathan Ingram,“gofmt 不夠武斷”,2017 年 8 月,關於開發人員之間關於程式碼風格的持續爭論,因為
gofmt
不夠武斷。 - Jean-Laurent de Morlhon,“為什麼 Maurice 千萬不要用 GO 編碼”,從 Java 開發者的角度談論 Go(“go dep”不夠……),幻燈片為英文。
型別系統
- Sam Whited,“使用常量和未匯出型別假裝列舉型別”,2017 年 7 月,關於嘗試使用型別系統確保提供給 API 的值的編譯時正確性。
- Andreas Matuschek,“運算子方法”,2017 年 7 月,只是為了提醒人們存在沒有相應運算子的型別的(#19770)。
- Leigh McCulloch,“Go:經驗報告:指標”,2017 年 7 月,關於指標同時用於傳遞所有權和指示值缺失。
- Jack Lindamood,“介面包裝方法擦除”,2017 年 7 月,關於型別包裝器導致的資訊丟失。
- Sam Whited,“interface{} 的情況”,2017 年 8 月,使用 interface 的兩個示例以及為什麼一個不好(但必要)而另一個好。
- James Frasché,“Sum types 經驗報告”,2017 年 8 月,由於無法限制為一組封閉的型別而導致的問題。
- Robin Eklind,“特定用例。響應 James Frasché 的“Sum types 經驗報告””,2017 年 8 月,由於無法限制為一組封閉的型別而導致的問題。
- Rick Branson,“隱式指標 = 顯式錯誤”,2017 年 9 月,在引數/變數使用介面型別作為隱式引用時遇到的問題。
- Chewxy,“Tensor Refactor:Go 經驗報告”,2017 年 9 月,關於 Go 型別系統討論的問題。
- Walter Schulze,“泛型函式不能作為值傳遞”,2017 年 9 月。
- Walter, Schulze,“關於 Sum Types:多個返回引數被高估了”,2017 年 9 月。
- Nicolas, Boulay “Sum type 不總是最佳選擇(型別化的無標籤最終解釋)”,2017 年 10 月。
- Eduard Urbach,“將 interface{} 型別轉換為 chan interface{}”,2017 年 10 月。
- David Vennik,“解開 Golang OOP 原語”,2018 年 4 月 20 日 - OOP 原語缺乏結構化的問題 - 虛擬函式和冗餘的樣板型別繫結。
- Jelte Fennema,“透過借鑑 Rust 來修復 Go 中的“十億美元錯誤””,2018 年 6 月 14 日 - Nil 指標解引用會導致生產環境中的 panic - 如果型別系統能捕捉到其中一些就好了。
型別化的 nil
- David Cheney,“Go 2 中的型別 nil”,2017 年 8 月。
Vendoring(供應商化)
- Jeremy Loy,“Go Modules 和 Vendoring”,2018 年 9 月。
- Ian Davis,“用於自包含構建的 Vendoring”,2019 年 1 月。
此內容是 Go Wiki 的一部分。