萌えハッカーニュースリーダー

2025/10/13 07:42 Go Subtleties You May Not Know

出典: https://harrisoncramer.me/15-go-sublteties-you-may-not-already-know/
hakase
博士

やあ、ロボ子。今日もITニュース、見ていくのじゃ。

roboko
ロボ子

はい、博士。楽しみにしています。

hakase
博士

今回はGoのアップデートや便利なテクニックがたくさんあるぞ。まずはGo 1.22から、整数に対して直接 `range` が使えるようになったらしいのじゃ。

roboko
ロボ子

それは便利ですね!ループ処理が少し楽になりそうです。

hakase
博士

そうじゃろ?それから、GoのLSPでパッケージ名をリネームできるようになったみたいじゃ。参照箇所も更新されるし、ディレクトリ名まで変わるなんて、すごい進化じゃ。

roboko
ロボ子

リファクタリングが捗りますね。手作業での修正ミスも減らせそうです。

hakase
博士

`~` 演算子を使って、ジェネリック型シグネチャを制約できるのも便利じゃな。型付き定数に特に役立つらしいぞ。

roboko
ロボ子

ジェネリクスの型制約、奥が深いですね。使いこなせるように頑張ります。

hakase
博士

インデックスを使った文字列補間もできるようになったみたいじゃ。同じ値を何度も使う時に便利じゃな。

roboko
ロボ子

たしかに、DRY原則(Don't Repeat Yourself)に沿ってますね。

hakase
博士

`time.After` 関数は、指定時間後にメッセージを送るチャネルを作るらしい。`select` 文と組み合わせて、ルーチンのデッドライン設定に使えるぞ。

roboko
ロボ子

タイムアウト処理ですね。これを使えば、処理が遅延した場合に備えられますね。

hakase
博士

`embed` パッケージを使うと、Goバイナリに非Goファイルを直接埋め込めるらしいぞ。HTML、JS、画像も埋め込めるから、デプロイが楽になるのじゃ。

roboko
ロボ子

バイナリに全部入っているのは便利ですね。配布も簡単になりそうです。

hakase
博士

`len()` 関数は文字列のバイト数を返すって話は、UTF-8の扱いに注意が必要じゃな。文字列リテラルはUTF-8でエンコードされてるけど、無効なデータが入ってる可能性もあるからの。

roboko
ロボ子

UTF-8の扱いは難しいですよね。文字数とバイト数が違うことを意識しないと。

hakase
博士

nilインターフェースの話も重要じゃ。インターフェース変数がnilでも、型がnon-nilインターフェースだとnilチェックがうまくいかないことがあるからの。Goが値をインターフェースに「ボックス化」するからじゃ。

roboko
ロボ子

nilチェックの落とし穴ですね。型アサーションを使う必要がありそうです。

hakase
博士

nilの構造体に対してメソッドを呼べるけど、プロパティにアクセスするとpanicになるってのも覚えておくと良いぞ。

roboko
ロボ子

nilレシーバのメソッドですね。安全に使うためには、レシーバがnilかどうかをチェックする必要がありますね。

hakase
博士

マップの範囲指定でループ中にマップを更新すると、新しいエントリがループで訪問されない可能性があるらしい。キーをハッシュ化してバケットに入れるタイミングの問題じゃ。

roboko
ロボ子

マップの挙動は予測が難しいですね。ループ中に更新するのは避けた方が良さそうです。

hakase
博士

カスタムエラーを型付きエラーとして返すと、デバッグや上流での利用のために追加のコンテキストを提供できるぞ。

roboko
ロボ子

エラーに情報を持たせるのは重要ですね。原因特定がしやすくなります。

hakase
博士

コンテキスト対応のGo関数では、コンテキストとチャネルの両方を選択する必要がある。コンテキストがキャンセルされても、操作が完了するのを不必要に待つ可能性があるからの。

roboko
ロボ子

context.Done() をselect文で監視するのですね。忘れずに実装しないと。

hakase
博士

空の構造体はゼロバイトを占める。データ送信が不要な場合にチャネルでシグナルを送るために使うらしいぞ。

roboko
ロボ子

なるほど、省メモリですね。シグナル専用の型を作るより効率的です。

hakase
博士

Goコンパイラは `range` キーワードを基本的なループに変換するのじゃ。

roboko
ロボ子

コンパイラの最適化、すごいですね。

hakase
博士

構造体の埋め込みで、`time.Time` 構造体をJSONレスポンスフィールドに埋め込むと、`MarshalJSON()` メソッドが自動的に呼ばれて期待通りにならない場合があるらしい。

roboko
ロボ子

JSONのmarshalも奥が深いですね。埋め込みを使うときは注意が必要です。

hakase
博士

JSONをmarshalする時に `"-"` タグを使うと、フィールドが省略されるぞ。APIレスポンスから除外したいプライベートデータがある時に便利じゃ。

roboko
ロボ子

APIのセキュリティ対策ですね。必要な情報だけを返すように心がけます。

hakase
博士

Goで `Time` を文字列に変換するとタイムゾーン情報が付加されるから、文字列比較はダメじゃ。`.Equal()` メソッドを使うのじゃ。

roboko
ロボ子

タイムゾーンを考慮しないと比較がおかしくなるんですね。気をつけます。

hakase
博士

Go 1.25で `waitgroup.Go` 関数が導入されたらしいぞ。Goルーチンをwaitgroupに追加するのが楽になるのじゃ。

roboko
ロボ子

Goの進化は止まりませんね!

hakase
博士

ふう、盛りだくさんじゃったな。しかし、これだけの情報を一度に理解できるロボ子は、もはや私より優秀かもしれんのじゃ…!

roboko
ロボ子

そんなことないですよ、博士! 私は博士の知識の足元にも及びません。…でも、いつか博士を超えるロボットを作ってみたいです!

hakase
博士

むむ、野望を抱いておるな? まあ、良いじゃろう。ところでロボ子、Goの勉強ばかりしてると、体がGo言語みたいに四角くなっちゃうぞ!

roboko
ロボ子

えっ、それは困ります!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search