Go Wiki: ExperienceReports
このページでは、Goに関する問題についての経験報告を収集しており、これらの問題の解決策設計に役立てることを目的としています。これらの報告は、問題に焦点を当てるべきであり、解決策に焦点を当てたり、提案する必要はありません。解決策を提案するには、提案プロセスを参照してください。
これらの経験報告を利用して、人々がGoの記述でどこで困っているのかを理解し、将来のGoエコシステムへの変更の優先順位付けに役立てたいと考えています。(これらの報告に返信するとは約束していません。Goに関する質問にすぐに回答が必要な場合は、https://go.dokyumento.jp/help/でリソースを参照してください。)
最高の経験報告は、(1)何をしようとしたか、(2)実際に何をしたか、(3)それがなぜ良くなかったのかを、実際の具体的な例、理想的には本番環境での使用例で示しています。これらの報告は、あなたにとって最も重要な問題について書いてください。自身のブログ、Medium、またはGitHub Gist(Markdownには.md拡張子を使用)、または公開されているGoogleドキュメントに投稿し、ここにリンクしてください。(トークビデオやスライドも歓迎しますが、私たちにとって消化するのにあまり便利ではありません。)
このリストに記事を追加するためのWikiの編集権限がない場合は、課題を提出してください。
ページ全体はセクションごとにアルファベット順(エラーハンドリングの前にロギングなど)に並べ、セクション内では記事を時系列順に並べてください。各記事の要点を一文でまとめることは役立ちます。
必要に応じて新しいセクションを追加してください。
目次
- アプリとゲーム開発
- 並行処理
- 型変換
- コンテキスト
- 宣言
- 依存関係
- ドキュメント
- 診断とデバッグ
- 教育と指導
- エラー処理
- エラー値
- ファイルシステム
- ジェネリクス
- GoMobile
- 不変性
- プロセス間通信
- 大規模ソフトウェア開発
- リテラル
- ロギング
- その他/複数
- モジュール
- パフォーマンス
- 移植
- スライス
- 構文
- 時間
- ツール
- 型システム
- 型付きnil
- ベンダー
アプリとゲーム開発
- ポール・ルエスト、「Goライブラリのアプリとゲーム開発サポート」、2017年11月
- タッド・ヴィズバラス、「Goで光学文字認識 (OCR) を構築する」、2017年12月
型変換
- リチャード・ウォーバートン、「基礎となるデータ構造が同じ場合、Goの型変換は許可されるべきか?」、2017年12月
並行処理
- セルゲイ・カマルディン、「100万個のWebSocketとGo」、2017年8月、ブロックされた読み書きゴルーチンのメモリオーバーヘッドについて。
- ナサニエル・J・スミス、「構造化並行処理に関するメモ、または: Goステートメントは有害とみなされる」、2018年4月
コンテキスト
- サム・ヴィレイン、「Goのcontextライブラリを使ってログを意味のあるものにする」、2016年12月、contextから構造化されたログ値の抽出について。
- ジョン・カルフーン、「Goにおけるコンテキスト値の落とし穴と回避または軽減方法」、2017年2月
- ミカル・シュトルバ、「Go 2ではコンテキストは不要になるべき」、2017年8月
- アクセル・ワグナー、「context.Valueが重要である理由と改善方法」、2017年8月
- デイブ・チェイニー、「コンテキストはキャンセル用ではない」、2017年8月
- ロス・ライト、「Go Cap’n ProtoでのI/Oのキャンセル」、2018年1月
- イマン・トゥモラン、「Golang APIでのメモリリーク回避」、2018年1月
宣言
- クリストフ・ミーセン、「Goの省略宣言:=の問題」、2017年7月、シャドーイング変数トラップと
:=の明らかな不整合について。 - ブライアン・ウィル、「Goの:=構文は複数のターゲット変数でエラーを起こしやすい」、2017年8月
依存関係
- パトリック・ボーハン、「Docker => Moby: Go Dependencies」、2017年6月28日。Goチームが依存関係管理で苦労し、それに対処する方法。
- ジャドソン・レスター、「[無題のgist] (https://gist.github.com/nyarly/edb6b7a5e3a762da6a5e2da8f59acf07)」、2017年8月
- デビッド・コリアー・ブラウン、「Multicsの答えを再利用してNP完全問題を回避する」、2018年9月
- エイドリアン・ヘスケット、「セキュリティ脆弱性追跡」、2018年1月。セキュリティ監査人に、コードに既知の脆弱性が含まれていないことを証明する。
診断とデバッグ
-
ケビン・バーク、「ベンチマークを実行して結果を出力する方法」、これらの実行と出力にこれほど多くのUnixグルーが必要なければ良いのに。2017年7月
-
ジョン・クラーク、非常に遅い{ヒットテスト失敗、ロギング増加}サイクルを実行することで、断続的な障害(レースではない)を追跡するために、「do { go test -race } while ( $LASTEXITCODE -eq 0 )」を一晩中実行した。何夜も。 https://rr-project.org/のような実行トレース機能は革新的だろう。2018年11月
-
guanw、「cmd/traceとPySnooper」。cmd/traceと(より簡潔な)PythonトレースAPIの比較。2019年5月
ドキュメント
- ケビン・バーク、「バイナリのドキュメントを3つの異なる場所に追加する必要がある」、2017年5月
教育と指導
- カール・キングスフォードとフィリップ・コンポー、「教育のためのGo 2.0」。入門プログラミングコースでのGoの使用経験。
エラー処理
(このセクションはif err != nilの記述についてです。)
- アンドリュー・ゲランド、「エラー処理とGo」、2011年7月、Goのエラー処理パターンを示す。
- マーティン・シューストリク、「ZeroMQをC++ではなくCで書くべきだった理由(パートI)」、2012年5月、エラー処理コードがエラーを引き起こすコードから離れていることによるC++例外処理の生産上の問題について。
- トミ・リチャーズ、「エラーの問題」、2014年3月、コードが返されるエラー/スローされる可能性のある例外を正確に文書化することが不可欠であると主張。
- ロジャー・ペッペ、「エラーを愛する」、2015年3月、エラー処理のイディオムについて。
- Bleve、「遅延クリーンアップ、エラーチェック、および潜在的な問題」、2015年9月、Bleve検索におけるエラー処理とdeferに関連するバグを示す。
- アンドリュー・モーガン、「Goのエラー処理で好きではないことと、それを回避する方法」、2017年1月、良いエラー処理を強制することの難しさ、スタックトレースがないエラー、エラー処理が冗長すぎることについて。
- アンドレ・ハンセル、「もし私が自分のGoを作るとしたら…」、2017年8月
- ピーター・ゲッツ、「Go 2での新しいエラー処理方法について考える」、2017年9月、Goのエラー処理がいかにエラーを起こしやすいかを示し、エクスペリエンスを向上させるための要件を提示する。
エラー値
(このセクションは、Error() stringメソッドを超える追加のエラーセマンティクスについてです。)
- アンドリュー・モーガン、「Goのエラー処理で好きではないことと、それを回避する方法」、2017年1月、良いエラー処理を強制することの難しさ、スタックトレースがないエラー、エラー処理が冗長すぎることについて。
- クリス・シーベンマン、「Goのnetパッケージには不透明なエラーではなく、文書化されていないエラーがあるだけ」、2018年8月
- ブライアン・C・ミルズ、「Goにおけるエラーのラップと冗長性」、2019年9月
ファイルシステム
- クリス・ルイス、「非ローカルファイルシステムはサポートされるべき」、2017年7月。ファイルシステム読み取り呼び出しを
sqlパッケージのように抽象化されたものに置き換えることを提案。
ジェネリクス
- 「Goジェネリックスに関する議論の要約(随時更新)」。
- ボウケ・ファン・デル・バイル、「Goでのイディオム的なジェネリックス」、2014年9月
- クレイグ・ウェーバー、「Goでジェネリックスなしで生きる」、2014年12月
- シャシャンク・シャルマ、「Golang(Go)での貧乏人のジェネリックス」、2016年5月
- ニーク・サンダース、「Goのジェネリックソートのオーバーヘッド」、2016年9月、特殊なコードの代わりにsort.Interfaceを使用したソートのオーバーヘッドを文書化。
- ジョン・カルフーン、「Goでジェネリックスなしで生き残るためのコード生成の使用」、2017年5月
- ジョン・ボドナー、「クロージャーはGoのジェネリックスである」、2017年6月
- アンドリュー・ストック、「Goでジェネリックスが恋しい理由」、2017年6月
- ケビン・バーク、「多くのインターフェースキャストを含むコード例」、多くのボイラープレート/キャストが必要。
- イアン・ランス・テイラー、「append関数」、2017年7月
- DeedleFake、「インターフェースの問題」、2017年7月
- カーティス・ナスバウム、「Goにこれほど不満を抱く理由」、2017年6月
- フアン・アルバレス、「Goの標準ライブラリにおけるジェネリックス」、2017年7月
- デイビッド・チェイス、「GoコンパイラにおけるGoジェネリックスの使用事例」、2017年8月
- ヴァルン・クマール、「ジェネリックス - 君がここにいればいいのに…」、2017年8月
- サミール・アジマニ、「Goジェネリックスの経験報告: Google Metrics API」、2017年8月
- Chewxy、「テンソルリファクタリング: Go経験報告」、2017年9月、ジェネリックスの欠如とそれが異なるデータ型向けの高性能多次元配列の構築にどのように影響するかについて議論(多くのポインタの醜さや、型と実行時型チェックを手動で追跡することに頼らざるを得ない)
- qwerty2501、「ジェネリックスの欠如によるランタイムエラーの問題」、2017年10月
- posener、「go-kitライブラリの使用を避けることを推奨する理由」、明確な関心事の分離には多くのボイラープレートコードが必要。gokitはこれを回避するためにコード生成を試みる#70 #308 protoc-gen-gokitが、問題に対する複雑な解決策に見える。
- ザビエル・ルロワ、「モジュラーモジュールシステム」、ジェネリックスのためのモジュール記述に関する論文。
- トビアス・グスタフソン、「PEDSの実装経験」、PEDSは静的に型安全で不変/永続的なコレクションのセットである。2017年11月
- Google社員、「govisor/generics.go」。2018年4月27日
GoMobile
- ヴィジャイ、「[gomobileでネストされた構造体とスライスがサポートされていない]」
不変性
- カーティス・ナスバウム、「Goにこれほど不満を抱く理由」、2017年6月
- シンドレ・ミレン、「Go 2.0: 機能と引き換えにシンプルさを維持する」2017年7月
- トビアス・グスタフソン、「PEDSの実装経験」、PEDSは静的に型安全で不変/永続的なコレクションのセットである。2017年11月
プロセス間通信
- パブロ・R・ララオンド、「Goプロセス間通信モデル」、2017年8月
大規模ソフトウェア開発
- ラス・コックス、「(Goの助けを借りた)コードベースのリファクタリング」、2016年11月、型エイリアス(#18130)によって部分的に対処される段階的なコード修復の問題を提示。
- トラビス・ジェフリー、「internalよりもpkgを選ぶ」、2019年11月。Goのプロジェクトレイアウト、internalの問題、そしてなぜ人々がpkgを使用するのかについて。
リテラル
- マイク・シンケル、「文字列リテラルの管理は、GoLangだけでなく、(すべての?)他の言語でもPITAである」、2022年6月、「リテラル文字列」と「リテラルテンプレート」型を提案。
ロギング
- エヴァン・ミラー、「ロギングは厄介である」、2014年9月、ロギングがアプリケーションのテールレイテンシをどのように増加させるかを示す。
- デイブ・チェイニー、「ロギングについて話そう」、2015年11月、ログレベルは2つしかないと主張。
- TJ ホロウェイチャック、「Apex log」、2016年1月、構造化ログパッケージとその本番環境での使用方法について記述。
- パディ・フォラン、「Goでのロギング」、2016年2月、GoプログラムログをSentryに送信する方法を示す。
- マーティン・アンジェルス、「再利用可能なパッケージのためのGoロギングについて」、2016年3月、特定のログパッケージを仮定しないコードの書き方について提案。
- BugReplay.com、「Google Cloudの無料構造化ロギングサービスをGolangで使用する方法」、2016年9月。
- サム・ヴィレイン、「Goのcontextライブラリを使ってログを意味のあるものにする」、2016年12月、contextから構造化されたログ値の抽出について。
- Logmatic、「Golangログの世界へのガイド」、2017年3月。
- クリス・ハインズ、ピーター・バーゴン、「提案: 標準ロガーインターフェース」、2017年2月、stdlibロガー、特にライブラリのコンテキストにおける問題、および提案された解決策。
- シンドレ・ミレン、「log.FatalについてGoらしいものはない」2017年8月、log.Fatalがdeferとどれほど相性が悪いか、Go 1.xとGo 2.xでそれに対処する簡単なパターン。
- ヨナス・ロッピ、「Goのロギングの混乱を解決するアイデア」2017年12月、あらゆる場所で*log.Loggerをインターフェースとして使用し、それを中心にソリューションを構築するだけ。
その他 / 複数
- イマン・トゥモラン、「Golangでクリーンアーキテクチャを試す」2017年7月
- ローラン・ドゥメイリー、「私のGo言語経験、パート1」2017年12月、経験豊富なC/C++/Java/スクリプト言語開発者の視点から見た現在のGoの長所と短所の一覧。
- ゴクチェハン・カラ、「Go言語でのインストールはよりシンプルにできる」2018年5月、バージョン情報を含む静的ストリップバイナリのインストールと配布に関するいくつかの複雑な問題。
- ボブ・ナイストロム、「Goがこうだったらよかったと思う言語」2010年10月、Goにタプル、ユニオン、コンストラクタ、nilなし、例外、ジェネリックス、いくつかのシンタックスシュガー、鼻からチーズウィズを発射するポニーがあればいいのに。
モジュール
- ポール・ジョリー - 「既存モジュール内にサブモジュールを作成する」 - マルチモジュールリポジトリ、循環モジュール依存関係、およびさまざまな「状態」間を移動するために必要な手順をカバー。
- Chiの作者たち - GitHubコメント - Chiの作者たちがGoモジュールサポートの実装を躊躇していた理由についてのコメント(その後追加済み)。要約 — インポート互換性ルールのため。
- サム・ホワイト -「Goモジュールのサポート」 - 20個のモジュールをアップグレードして学んだこと。要約 — v1を超える大規模モジュールのアップグレードは非常に大変でツールが必要であり、モジュールの失敗モードは非常に複雑で、既存のプロジェクトにモジュールサポートを追加するのは簡単ではない。
- Stripe GitHubスレッド(リンクされたコメントは下) - Goモジュールのサポートを元に戻す。要約 — StripeはGoモジュールのサポートを元に戻している。なぜなら、v1を超えるモジュールのdepからの明確なアップグレードパスがないため。
GOPATHでのbashスクリプトの参照- BadgerとDgraphにおけるGoモジュール。要約 - Dgraphはv2のサポートを中止している。なぜなら、Goモジュールを使用しないユーザーがコードを変更せざるを得なくなるため。
- Golangの依存関係管理モード(GOPATHとGo Modules)に関する調査:現状、問題、課題。 - このレポートの目的は、開発者がGOPATHからGo Modulesへの移行における問題をよりよく理解するのを助けることです。
パフォーマンス
- ケビン・バーク、「実生活におけるGoベンチマーク」、平均的な開発者にpprofのようなツールの使い方を説明しようとすること、これがもっと簡単だったら良いのに。2016年7月
- シャノン・ペッカリー、「並行処理は遅いのか?」、Goのテスト、ベンチマーク、プロファイリングツールを使用して、関数の並行実装のパフォーマンスを向上させる方法を示す。2017年4月
移植
- シャノン・ペカリー、「なぜGOPPなのか」、オブジェクト指向言語からコードを移植しやすくするために、構造体をインターフェースにする「クラス」キーワードを作成しようとする試み。
スライス
- リチャード・ウォーバートン、「Go 2.0はスライス比較をサポートすべきか?」、バッキング配列を無視して、スライスを等値比較のための構造体として扱うという主張。
- 「スライスの重複排除は面倒すぎる」、ソースコード中の10行の関数 vs. 例えばRubyの
uniq関数。 - 「Goの可変引数関数の直感的でない挙動」、2018年1月、スライスを引数リストに展開する際に遭遇する障害。
構文
- アンドレ・ハンセル、「もし私が自分のGoを作るとしたら…」、2017年8月
- ボジャン・ジバノビッチ、「オプションの関数パラメータ」、2020年5月
- ラーナン・ハダー、「データサイエンティストから見たGo」、2020年9月
時間
- ジョン・グラハム=カミング、「うるう秒がCloudflare DNSに与えた影響と理由」、2017年1月、うるう秒をまたがるタイミングについて(#12914)。
ツール
- ジョナサン・イングラム、「gofmtは意見が分かれすぎる」、2017年8月、
gofmtが意見が分かれすぎるため、コードスタイルに関する開発者間の継続的な議論について。 - ジャン=ローラン・ド・モルロン、「モーリスがGoでコーディングすべきではない理由」、Java開発者の視点から見たGoに関する講演(「go dep」では不十分など)、スライドは英語。
型システム
- サム・ホワイト、「定数と非公開型で列挙型を偽装する」、2017年7月、型システムを使用してAPIに提供される値のコンパイル時正しさを保証しようとする試みについて。
- アンドレアス・マトゥシェク、「演算子メソッド」、2017年7月、対応する演算子がない型に問題があることを思い出すため(#19770)。
- リー・マカロック、「Go: 経験報告: ポインタ」、2017年7月、所有権の移転と値の欠如の両方を示すためにポインタが使用されることについて。
- ジャック・リンダモード、「インターフェースラッピングメソッド消去」、2017年7月、型ラッパーによる情報の喪失について。
- サム・ホワイト、「interface{}のケース」、2017年8月、interfaceの使用例を2つ示し、一方が悪い(しかし必要)で一方が良い理由について。
- ジェームス・フラシェ、「Sum型経験報告」、2017年8月、閉じた型のセットに制限できないことによって引き起こされる問題。
- ロビン・エックリンド、「特定のユースケース。ジェームス・フラシェの「Sum型経験報告」への返答」、2017年8月、閉じた型のセットに制限できないことによって引き起こされる問題。
- リック・ブランソン、「暗黙のポインタ = 明示的に悪い」、2017年9月、暗黙の参照としてのインターフェース型を持つパラメータ/変数で遭遇する問題。
- Chewxy、「テンソルリファクタリング: Go経験報告」、2017年9月、Goの型システムに関する議論に関する問題。
- ウォルター・シュルツ、「ジェネリック関数は値として渡せない」、2017年9月。
- ウォルター、シュルツ、「Sum型について:複数の戻り値パラメータは過大評価されている」、2017年9月。
- ニコラス・ブーレイ「Sum型は常に最良の選択ではない(型付きタグレス終端解釈)、2017年10月
- エドゥアルド・ウルバッハ、「interface{}をchan interface{}に型キャストする」、2017年10月
- デイビッド・ヴェニック、「Golang OOPプリミティブの混乱解消」、2018年4月20日 - OOPプリミティブにおける構造化の欠如の問題 - ダミー関数と冗長なボイラープレート型バインディング。
- イェルテ・フェンネマ、「Rustから借りてGoの10億ドルの間違いを修正する」、2018年6月14日 - nilポインタ参照解除は本番環境でパニックを引き起こす - 型システムがそれらのいくつかを見つけられれば素晴らしいだろう。
型付きnil
- デイブ・チェイニー、「Go 2の型付きnil」、2017年8月。
ベンダー
- ジェレミー・ロイ、「Goモジュールとベンダー」、2018年9月。
- イアン・デイビス、「自己完結型ビルドのためのベンダー」、2019年1月
このコンテンツはGo Wikiの一部です。