Go Wiki: ExperienceReports
このページでは、Goでの問題に関する経験レポートを収集し、それらの問題に対するソリューションの設計に役立てます。これらのレポートは問題に焦点を当てる必要があり、解決策を提案する必要はありません。解決策を提案する場合は、提案プロセスを参照してください。
これらの経験レポートは、人々がGoの記述でどこで問題に直面しているかを理解し、Goエコシステムに対する将来の変更を優先順位付けするのに役立つことを期待しています。(これらへの返信を約束するものではありません。Goに関する質問への回答がすぐに必要な場合は、https://go.dokyumento.jp/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, “100万のWebSocketとGo,” 2017年8月、ブロックされた読み取り/書き込みゴルーチンのメモリオーバーヘッドについて。
- Nathaniel J. Smith, “構造化された並行処理に関するメモ、または:Goステートメントは有害であると考える”, 2018年4月。
コンテキスト
- Sam Vilain, “ログを理解するためにGoのコンテキストライブラリを使用する,” 2016年12月、コンテキストから構造化されたログ値を抽出することについて。
- Jon Calhoun, “Goでのコンテキスト値の落とし穴とそれを回避または軽減する方法,” 2017年2月。
- Michal Štrba, “Go 2ではコンテキストを廃止すべき,” 2017年8月
- Axel Wagner, “なぜcontext.Valueが重要なのか、そしてそれを改善する方法,” 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月、varのシャドーイングの罠と、`:=`の見かけ上の不整合について。
- 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, “3つの異なる場所にバイナリのドキュメントを追加する必要がある”, 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, “エラーを愛する,” 2015年3月、エラー処理のイディオムについて議論しています。
- Bleve, “遅延クリーンアップ、エラーチェック、および潜在的な問題,” 2015年9月、Bleve検索でのエラー処理とdeferに関連するバグを示しています。
- 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のstdlibでのジェネリクス”, 2017年7月。
- David Chase, “GoコンパイラーでのGoジェネリクスのユースケース”, 2017年8月
- Varun Kumar, 「ジェネリクス - ああ、あなたがここにいれば…」、2017年8月
- Sameer Ajmani, 「ジェネリクスに関するGoの経験レポート:Google metrics API」、2017年8月
- Chewxy, 「テンソルリファクタリング:Goの経験レポート」、2017年9月、ジェネリクスがないこと、および異なるデータ型に対して高性能な多次元配列を構築する際にそれがどのように影響するか(多くのポインタの醜さや、型とランタイム型のチェックを手動で追跡しなければならない)について議論しています。
- qwerty2501, 「ジェネリクスの欠如によるランタイムエラーの問題」、2017年10月
- posener, 「go-kitライブラリの使用を避けることをお勧めする理由」、関心事の明確な分離には多くのボイラープレートコードが必要。gokitはこれを避けるためにコード生成を試みます(#70 #308 protoc-gen-gokit)が、この問題に対する複雑な解決策に見えます。
- Xavier Leroy, 「モジュール式モジュールシステム」、ジェネリクスのためのモジュール記述に関する論文。
- Tobias Gustafsson, 「PEDS実装の経験」、PEDSは静的に型安全な、不変/永続的なコレクションのセットです。2017年11月
- Google社員, 「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, 「私はinternalよりもpkgを取ります」、2019年11月。Goプロジェクトのレイアウト、internalの問題、および人々がpkgを使用する理由について説明しています。
リテラル
- Mike Schinkel, 「文字列リテラルの管理は、GoLangだけでなく、(すべての?)他の言語でも面倒です」、2022年6月、「リテラル文字列」および「リテラルテンプレート」型を提案しています。
ロギング
- Evan Miller, 「ロギングはトリッキーになりえる」、2014年9月、ロギングがアプリケーションのテールレイテンシをどのように増加させるかを示しています。
- Dave Cheney, 「ロギングについて話しましょう」、2015年11月、ログレベルは2つしかないと主張しています。
- TJ Holowaychuk, 「Apexログ」、2016年1月、構造化ログパッケージと、それが本番環境でどのように使用されるかを説明しています。
- Paddy Foran, 「Goでのロギング」、2016年2月、GoプログラムのログをSentryに送信する方法を示しています。
- Martin Angers, 「再利用可能なパッケージのためのGoロギングについて」、2016年3月、特定のログパッケージを想定しないコードの書き方について提案しています。
- BugReplay.com, 「Google Cloudの無料構造化ロギングサービスをGolangで使用する方法」、2016年9月。
- Sam Vilain, “ログを理解するためにGoのコンテキストライブラリを使用する,” 2016年12月、コンテキストから構造化されたログ値を抽出することについて。
- Logmatic, 「Golangログの世界へのガイド」、2017年3月。
- Chris Hines, Peter Bourgon, 「提案:標準ロガーインターフェース」、2017年2月、特にライブラリのコンテキストにおけるstdlibロガーに関連する問題と、提案された解決策の1つ。
- 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 langの経験、パート1」、2017年12月、経験豊富なC/C++/Java/スクリプト言語開発者の視点からの現在のGoの長所と短所のリスト。
- Gokcehan Kara, 「Go言語でのインストールはよりシンプルになる可能性があります」、2018年5月、バージョン情報付きの静的にストリップされたバイナリのインストールと配布に関するいくつかの複雑さ。
- Bob Nystrom, 「Goがそうであってほしい言語」、2010年10月、私はGoにタプル、ユニオン、コンストラクタ、Nilがないこと、例外、ジェネリクス、いくつかの糖衣構文、そして鼻からチーズウィズを撃つポニーが欲しいです。
モジュール
- Paul Jolly - 「既存のモジュール内にサブモジュールを作成する」- マルチモジュールリポジトリ、循環モジュール依存関係、およびさまざまな「状態」間を移動するために必要な手順をカバーしています。
- Chi authors - GitHubコメント - Chiの作者がGoモジュールのサポートの実装を保留した理由(その間に追加されました)に関するコメント。要約すると、インポート互換性ルールのためです。
- Sam Whited - 「Goモジュールのサポート」- 20個のモジュールをアップグレードしたことから学んだこと。要約すると、v1を超えて大きなモジュールをアップグレードすることは非常に面倒であり、ツールが必要であり、モジュールの失敗モードは非常に複雑であり、既存のプロジェクトにモジュールサポートを追加するのは簡単です。
- Stripe GitHubスレッド(リンクされたコメント) - Goモジュールのサポートを元に戻す。要約すると、Stripeはv1を超えるモジュールに対してdepからの明確なアップグレードパスがないため、Goモジュールのサポートを元に戻しています。
GOPATH
でbashスクリプトを参照する- BadgerおよびDgraphのGoモジュール。要約すると、Dgraphはv2のサポートを中止します。これはGoモジュールを使用していないユーザーにコードの変更を強制するためです。
- Golangの依存関係管理モード(GOPATHとGoモジュール):現状、問題と課題に関する調査。- このレポートの目的は、開発者がGOPATHからGoモジュールへの移行における問題をよりよく理解するのを支援することです。
パフォーマンス
- Kevin Burke, 「実際のGoベンチマーク」、pprofのようなツールを平均的な開発者がどのように使用するかを説明しようとしています。多分これはより簡単になるかもしれません。2016年7月。
- Nathan Kerr, 「同時実行は遅い?」、Goのテスト、ベンチマーク、およびプロファイリングツールを使用して、関数の同時実行の実装のパフォーマンスを向上させる方法を示しています。2017年4月。
移植
- Shannon Pekary, 「なぜGOPPなのか」、「class」キーワードを作成しようとしています。これは、オブジェクト指向言語からのコードの移植をはるかに簡単にするために、structをインターフェースにするだけです。
スライス
- 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, 「なぜモーリスは絶対にGOでコーディングしてはいけないのか」、java開発者の視点からのGoに関する講演(「go dep」だけでは十分ではない、…)、スライドは英語です。
型システム
- Sam Whited, 「Constsと未エクスポート型による列挙型の偽装」、2017年7月、型システムを使用してAPIに提供される値のコンパイル時における正確性を保証しようとすることについて。
- Andreas Matuschek, 「演算子メソッド」、2017年7月、対応する演算子がない型に問題があることを覚えておくだけです(#19770)。
- Leigh McCulloch, 「Go:経験レポート:ポインタ」、2017年7月、所有権の譲渡と値の欠如を示す両方のためにポインタが使用されていることについて。
- Jack Lindamood, 「インターフェースのラッピングによるメソッド消去」、2017年7月、型ラッパーによる情報の損失について
- Sam Whited, 「interface{}のケース」、2017年8月、interfaceの使用例を2つ示し、1つは悪い(ただし必要)、もう1つは良い理由。
- James Frasché, 「和型の経験レポート」、2017年8月、型の閉じたセットに制限できないことが原因で発生する問題
- Robin Eklind, 「具体的な使用例。James Fraschéの「和型の経験レポート」への回答」、2017年8月、型の閉じたセットに制限できないことが原因で発生する問題
- Rick Branson, 「暗黙的ポインタ = 明示的に悪い」、2017年9月、インターフェース型を持つパラメータ/変数が暗黙的な参照として発生した問題
- Chewxy、「Tensor Refactor: A Go Experience Report」、2017年9月、Goにおける型システムに関する議論の問題点
- Walter Schulze、「ジェネリック関数は値として渡すことができない」、2017年9月
- Walter, Schulze、「Sum型に関して:複数の戻り値は過大評価されている」、2017年9月
- Nicolas, Boulay、「Sum型が常に最良の選択とは限らない(型付きタグレスファイナル解釈)」、2017年10月
- Eduard Urbach、「interface{}をchan interface{}へ型キャストする」、2017年10月
- David Vennik、「GolangのOOPプリミティブの整理」、2018年4月20日 - OOPプリミティブにおける構造化の欠如の問題 - ダミー関数と冗長なボイラープレート型バインディング。
- Jelte Fennema、「Rustから借りてGoにおける10億ドルの過ちを修正する」、2018年6月14日 - nilポインタのデリファレンスは本番環境でパニックを引き起こす - もし型システムがそれらのいくつかをキャッチできたら素晴らしいだろう。
型付きnil
- David Cheney、「Go 2 における型付きnil」、2017年8月。
ベンダーリング
- Jeremy Loy、「Goモジュールとベンダーリング」、2018年9月。
- Ian Davis、「自己完結型ビルドのためのベンダーリング」、2019年1月
このコンテンツはGo Wikiの一部です。