Go Wiki: 經驗報告
此頁面收錄關於 Go 問題的經驗報告,可能會說明我們針對這些問題所設計的解決方案。這些報告應關注於問題:不應關注並不需要提出解決方案。如需提出解決方案,請參閱提案程序。
我們希望運用這些經驗報告,了解人們在撰寫 Go 時遇到哪些困難,以協助我們優先排序 Go 生態系統未來的變更。(我們不保證會回覆這些報告。如果您需要立即協助回答有關 Go 的問題,請參閱https://go.dev.org.tw/help/以取得資源。)
最佳的經驗報告會說明:(1) 您想做的事情、(2) 您實際上所做的事情,以及 (3) 為何這樣的作法不佳,這些內容會透過具體而真實的範例加以說明,理想上會來自於實際使用中的範例。請針對對您而言最重要的問題撰寫這些報告,張貼到您自己的部落格或 Medium,或以GitHub Gist(對 Markdown 檔案使用 .md
擴充名)或可公開閱讀的 Google 文件方式發表,然後在此處提供連結。(我們也歡迎對談影片或投影片,不過這些對我們而言不太容易消化。)
如果您沒有權限編輯 wiki 來為此清單新增文章,請提交問題。
請依區段(錯誤處理在記錄之前,以此類推)對整個網頁進行按字母順序排序。在區段內請按時間順序對文章進行排序。包含每個文章重點的單字句摘要會很有幫助。
適當地新增區段。
目錄
- 應用程式與遊戲開發
- 並行運算
- 轉型
- 背景
- 宣告
- 相依性
- 文件
- 診斷與除錯
- 教育與教學
- 錯誤處理
- 錯誤值
- 檔案系統
- 泛型
- GoMobile
- 不可變性
- 程序間通訊
- 大型軟體開發
- 字面常數
- 記錄
- 綜合/多重
- 模組
- 效能
- 移植
- 序列
- 語法
- 時間
- 工具
- 型別系統
- 帶型的 nil
- 供應
應用程式與遊戲開發
- Paul Ruest,「應用程式與遊戲的 Go 函式庫支援」,2017 年 11 月
- Tad Vizbaras,「用 Go 建構光學字元辨識 (OCR)」,2017 年 12 月
轉型
- Richard Warburton,「當底層資料結構相同時,Go 轉型是否應被允許?」,2017 年 12 月
並行運算
- Sergey Kamardin,「百萬個 WebSocket 和 Go」,2017 年 8 月,關於封鎖讀寫 goroutines 的記憶體開銷。
- Nathaniel J. Smith,「結構化並行運算筆記,或:Go 陳述式被視為有害」,2018 年 4 月。
背景
- Sam Vilain,「使用 Go 的背景函式庫,讓你的記錄變得有意義」,2016 年 12 月,關於從背景萃取結構化記錄值。
- Jon Calhoun,「背景值的陷阱,以及如何在 Go 中避免或降低影響」,2017 年 2 月。
- Michal Štrba,「背景應從 Go 2 中移除」,2017 年 8 月
- Axel Wagner,「背景值為何重要,以及如何改善它」,2017 年 8 月。
- Dave Cheney,「背景不適用於取消」,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-Complete 的問題〉,2018 年 9 月。
- Adrian Hesketh,〈追蹤安全性漏洞〉,2018 年 1 月。向安全性稽核證明,程式碼不包含已知的漏洞。
診斷與除錯
-
Kevin Burke,〈我如何執行基準測試並列印其結果〉,希望不需要這麼多的 Unix 粘膠程式碼就可以執行和列印這些內容。2017 年 7 月。
-
John Clarke,透過執行「do { go test -race } while ( $LASTEXITCODE -eq 0 )」連續多晚,追蹤一個間歇性故障(不是競爭條件)的方法是執行一個非常緩慢的 {hit test 失敗,增加紀錄} 循環。在許多個晚上都這麼做。執行追蹤功能,例如 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,而不是 C++ 來撰寫 ZeroMQ(第 I 部分)〉,2012 年 5 月,討論 C++ 例外處理的生產問題,因為錯誤處理程式碼遠離造成錯誤的程式碼。
- Thomi Richards,〈錯誤的問題〉,2014 年 3 月,主張程式碼必須詳細記錄它會傳回什麼錯誤/會引發哪些例外。
- Roger Peppe,〈Lovin’ your errors〉,2015 年 3 月,討論有關錯誤處理的慣用語。
- Bleve,〈Deferred Cleanup, Checking Errors, and Potential Problems〉,2015 年 9 月,顯示與 Bleve 搜尋的錯誤處理和延遲有關的錯誤。
- Andrew Morgan,〈What I Don’t Like About Error Handling in Go, and How to Work Around It〉,2017 年 1 月,說明難以強制良好錯誤處理、錯誤沒有堆疊追蹤,以及錯誤處理過於冗長。
- André Hänsel,〈If Ⅰ were to make my own Go…”,2017 年 8 月。
- Peter Goetz,〈Thinking About New Ways of Error Handling in Go 2〉,2017 年 9 月,顯示 Go 中容易發生錯誤的錯誤處理,並提出改善體驗的要求。
錯誤值
(此部分說明錯誤語意,除了 Error() string
方法之外。)
- Andrew Morgan,〈What I Don’t Like About Error Handling in Go, and How to Work Around It〉,2017 年 1 月,說明難以強制良好錯誤處理、錯誤沒有堆疊追蹤,以及錯誤處理過於冗長。
- Chris Siebenmann,〈Go’s net package doesn’t have opaque errors, just undocumented ones〉,2018 年 8 月。
- Bryan C. Mills,〈Error Wrapping and Redundancy in Go〉,2019 年 9 月。
檔案系統
- Chris Lewis,〈Non-Local File Systems Should Be Supported〉,2017 年 7 月。建議取代檔案系統讀取呼叫為更抽象的呼叫,例如
sql
套件。
泛型
- 〈Summary of Go Generics Discussions (living document)〉。
- Bouke van der Bijl,〈Idiomatic Generics in Go〉,2014 年 9 月。
- Craig Weber,〈Living without generics in Go〉,2014 年 12 月。
- Shashank Sharma,〈Poor man’s generics in Golang (Go)〉,2016 年 5 月。
- Niek Sanders,〈Overhead of Go’s generic sort〉,2016 年 9 月,文件說明使用 sort.Interface 排序的額外負擔,而非使用特殊化程式碼。
- Jon Calhoun,〈Using code generation to survive without generics in Go〉,2017 年 5 月。
- Jon Bodner, 「Closure 是 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 指標 API」,2017 年 8 月。
- Chewxy,「Tensor Refactor:一個 Go 經驗報告」,2017 年 9 月,討論缺少泛型以及這將如何影響建置不同資料類型的效能高多維陣列(必須使用大量的指標醜化,以及手動追蹤類型並執行時間類型檢查)。
- qwerty2501,「由於缺乏泛型導致的執行時間錯誤問題」,2017 年 10 月。
- posener,「為何我建議避免使用 go-kit 函式庫」,清楚的關心分隔需要大量的樣板檔案代碼。gokit 嘗試使用程式碼產生來避免這個問題 #70 #308 protoc-gen-gokit ,但這看起來像是個複雜的解決方案。
- Xavier Leroy,「模組式模組系統」,泛型模組描述的論文。
- 托比亞斯·古斯塔夫森,“實作 PEDS 的經驗”,PEDS 是一組靜態類型安全、不可變/持續性儲存的集合。2017 年 11 月
- Google 員工“govisor/generics.go”。2018 年 4 月 27 日
GoMobile
- Vijay,“[gomobile 不支援巢狀結構和切片]”
不可變性
- Kurtis Nusbaum「為甚麼我對 Go 如此沮喪」,2017 年 6 月。
- 辛德爾·米倫“Go 2.0:以交易功能來保持簡潔性”2017 年 7 月
- 托比亞斯·古斯塔夫森,“實作 PEDS 的經驗”,PEDS 是一組靜態類型安全、不可變/持續性儲存的集合。2017 年 11 月
程序間通訊
- 帕布羅·R·拉倫多“一種 Go 跨程序通訊模型,”2017 年 8 月
大型軟體開發
- 拉斯·考克斯,“程式碼庫重構(Go 助攻),”2016 年 11 月,提出逐步的程式碼修復問題,部分由類型別名解決(#18130)。
- 崔維斯·傑弗瑞,“我將 pkg 優先於 internal,”2019 年 11 月;討論 Go 專案配置、internal 的問題,以及人們為何使用 pkg。
字面常數
- 麥克·辛克爾,“管理字串文字很麻煩,不只在 GoLang 中,在(所有?)其他語言中都是,”2022 年 6 月,提出建議的“文字字串”和“文字範本”類型。
記錄
- 伊凡·米勒,“記錄可能會很棘手,”2014 年 9 月,展示記錄如何會增加應用程式的 tail 延遲時間。
- 戴夫·切尼,“我們來談談記錄,”2015 年 11 月,論述只有兩個記錄層級。
- TJ Hollowaychuk,“Apex 記錄,”2016 年 1 月,說明一種結構記錄封裝,以及如何在製作中使用它。
- 派迪·福蘭,“Go 中的記錄,”2016 年 2 月,展示如何將 Go 程式記錄傳送到 Sentry。
- 馬丁·安格斯,“關於可重複使用的封裝的 Go 記錄,”2016 年 3 月,提出建議說明如何寫不會假設特定記錄封裝的程式碼。
- BugReplay.com,“如何使用 Google Cloud 的免費結構化記錄服務搭配 Golang,”2016 年 9 月。
- Sam Vilain,「使用 Go 的背景函式庫,讓你的記錄變得有意義」,2016 年 12 月,關於從背景萃取結構化記錄值。
- Logmatic,“我們的 Golang 記錄世界指南,”2017 年 3 月。
- Chris Hines、Peter Bourgon「建議:標準 Logger 介面」,2017 年 2 月,與 stdlib 紀錄器相關的問題、特別是在函式庫的背景下,和一個建議的解決方案。
- Sindre Myren,〈log.Fatal 沒有任何 Go 的特色」,2017 年 8 月説明 log.Fatal 處理遞延運算很差,以及在 Go 1.x 和 Go 2.x 中處理它的簡單範例。
- Joonas Loppi,「一個修復 Go 記錄混亂的想法」2017 年 12 月,僅在各處使用 *log.Logger 作為介面,並編成周圍的解決方案。
其他 / 多重
- Iman Tumorang,「嘗試 Go 的乾淨架構」2017 年 7 月
- Laurent Demailly,「我的 Go lang 體驗,第 1 部分」2017 年 12 月列出一份優缺點清單,包含一位有經驗的 C/C++/Java/腳本語言開發人員觀點的目前 Go。
- Gokcehan Kara,「在 Go 語言中的安裝可以更簡單」2018 年 5 月,說明安裝和散佈帶有版本資訊的靜態剝離二進位檔案的一些複雜性。
- Bob Nystrom,「我希望 Go 的語言」2010 年 10 月,我希望 Go 有陣列,聯集,建構項,沒 Nil、例外、泛型,一些語法糖,還有鼻子上射出起司通心粉的矮馬。
模組
- Paul Jolly - 「在現有模組中建立子模組」- 涵蓋多模組儲存庫、循環的模組依賴性,以及在各種「狀態」之間移動所需的步驟。
- Chi 作者 - GitHub 意見 - 說明 Chi 作者為何堅持不實作 Go 模組支援 (現已新增)。簡而言之 - 由於匯入相容性規則。
- Sam Whited -「支援 Go 模組」- 從升級 20 個模組中吸取的經驗。簡而言之 - 將大型模組升級到 v1 以上非常困難,需要工具,模組的失敗模式非常複雜,將模組支援新增到現有專案非常容易出錯。
- Stripe GitHub 串聯(已連結的留言載於下方) - 取消支持 Go 模組。TL;DR — Stripe 取消支持 Go 模組,因為沒有明確的升級路徑讓 dep 套用到 v1 以上的模組。
- 參考
GOPATH
中的 bash 指令碼 - Badger 和 Dgraph 上的 Go 模組。TL;DR - Dgraph 取消支援 v2,因為這會強迫非 Go 模組使用者變更其程式碼。
- 有關 Golang 相依性管理模式(GOPATH 和 Go 模組)的調查:現狀、問題與挑戰。- 此報告之目的是幫助開發人員更瞭解從 GOPATH 過渡到 Go 模組時的問題。
效能
- 凱文·伯克,「真實世界的 Go 基準」,試著向一般開發人員說明如何使用 pprof 等工具,也許這樣會比較容易。 2016 年 7 月。
- 內森·科爾,「並行較慢?」,展示如何使用 Go 的測試、基準和分析工具來提升某個函式並行實作的效能。2017 年 4 月。
移植
- 珊農·皮卡里,「為何使用 GOPP」,這是一項嘗試建立「類別」關鍵字的舉措,讓結構體同時也是介面,以便大幅簡化從物件導向語言搬移程式碼。
序列
- 理查·華伯頓,「Go 2.0 是否應支援切片比較?」,這是主張將切片視為結構體進行等值比較,而忽略後援陣列的論點。
- 「重複資料的切片去重過於繁瑣」,將程式碼中的 10 行函式和 Ruby 的
uniq
函式進行比較。 - 「Go 可變參數函式的非直覺行為」,2018 年 1 月,在將切片展開成引數清單時遇到的障礙。
語法
- André Hänsel,〈If Ⅰ were to make my own Go…”,2017 年 8 月。
- 博揚·席瓦諾維奇,「函式選用參數」,2020 年 5 月。
- 拉亞南·哈達,「資料科學家對 Go 的看法」,2020 年 9 月。
時間
- 約翰·葛拉罕-卡明,「閏秒如何影響 Cloudflare DNS」,2017 年 1 月,關於閏秒的時序 (#12914)。
工具
- 喬納森·英格蘭,「gofmt 的觀點不夠明確」,2017 年 8 月,關於開發人員因
gofmt
的觀點不夠明確而持續進行的程式碼風格辯論。 - Jean-Laurent de Morlhon,不要讓莫里斯使用 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,介面的情況,2017 年 8 月,使用介面的兩個範例,說明為什麼一個不好(但有必要),而一個很好。
- James Frasché,和型體驗報告,2017 年 8 月,由於無法限制為封閉的類型集而產生的問題
- Robin Eklind,具體使用案例。為回應 James Frasché 的「和型體驗報告」,2017 年 8 月,由於無法限制為封閉的類型集而產生的問題
- Rick Branson,隱式指標 = 明確的壞,2017 年 9 月,介面類型參數/變數當作隱式參考時遇到的問題
- Chewxy,張量重構:Go 體驗報告,2017 年 9 月,關於在 Go 中討論類型系統
- Walter Schulze,通用函式無法當成值傳遞,2017 年 9 月
- Walter, Schulze,和型:多個傳回參數被高估了,2017 年 9 月
- Nicolas, Boulay “Sum 型式不總是最佳選擇(型別標籤最終詮釋), 2017 年 10 月
- Eduard Urbach, “介面{}類型轉換至介面{}頻道”, 2017 年 10 月
- David Vennik, “解除 Golang OOP 原語的混淆”, 2018 年 4 月 20 日 - 缺乏 OOP 原語建構的問題 - 空白函數和多餘樣板類型繫結
- Jelte Fennema, “從 Rust 借用修正 Go 中價值不菲的錯誤”, 2018 年 6 月 14 日 - 空指標解除參考在成品中引起恐慌 - 如果類型系統能夠捕捉到部分情況,會很不錯
帶型的 nil
- David Cheney, “Go 2 中的型別空值”, 2017 年 8 月
供應
此內容是 Go Wiki 的一部分。