はじめに
これははてなエンジニア Advent Calendar 2025 18日目の記事です。昨日は
id:kouki_dan の毎日1コミットを続けて1年が経った - Lento con forzaでした。
id:utgwkk です。Goを書いていて、頻出のイディオムをもっと短く書きたい! という欲求に駆られることがあると思います。そのような場面に出くわした人は、プロダクト内にちょっとしたコードを書いて便利に使うようになります。
今日の記事は、そうやってプロダクトのあちこちに登場する、ともすれば脚光を浴びることのないかもしれないコード片たちのことを思い出す、という趣旨になっています。
func Must[T any](T, error) T
func Must[T any](x T, err error) T { if err != nil { panic(err) } return x }
返り値の型が (T, error) のようにエラーを返しうる関数 f があったとして、Must(f()) のように呼び出すことで、エラー時の条件分岐を省略できます。エラーが発生したらpanicします。
テストコードや、アプリケーションの起動時に一度だけ実行する初期化処理などではよく使います。html/templateなど、標準ライブラリでも使われているイディオムです*1。Go 1.18でジェネリクスが導入された*2ことによって、同様のイディオムが1つの関数で (型ごとに関数定義を分けることなく) 実現できるようになりました。
エラーが返る場合の条件分岐を無視して値を返すことで、メソッドチェーンなどを書きやすくなるため、テストコードでは重宝します。もちろん、普通は乱暴にpanicするのを避けて、ちゃんとエラーをチェックするべきです。
Goのエラーハンドリングについては何かと話題になりがちですが、2025/12/17現在、Goチームは当面の間エラーハンドリングにまつわる文法の変更を停止する、と表明しています。
For the foreseeable future, the Go team will stop pursuing syntactic language changes for error handling. We will also close all open and incoming proposals that concern themselves primarily with the syntax of error handling, without further investigation.
[ On | No ] syntactic support for error handling - The Go Programming Language
func ReferenceOf[T any](T) *T
func ReferenceOf[T any](t T) *T { return &t }
渡した引数に対する参照を返します。たとえば、optionalなint型という気持ちで *int 型 (intのポインタ) を渡す場面があったとして、普通に書くとint型の変数を定義した上でその参照を取ることになると思います。ReferenceOf 関数を導入することで、これが1行で書けるようになります。
// before x := 1 f(&x) // after f(ReferenceOf(1))
このイディオムはaws-sdk-go V2でも形を変えてよく使われています。API呼び出しのパラメータを渡すために aws.String のような関数を使ったことがあるかもしれませんが、まさに与えられた文字列の参照を返すような実装になっています*3。
ちなみに、Go 1.26では組み込み関数の new を使うことで、同様のことが実現できるようになる予定です*4。つまり ReferenceOf 関数は、プロダクトのGoのバージョンが1.26になったら引退してもらえる可能性が高いということですね。今まで本当にありがとう……。
おわりに
あなたの手元のGoプロダクトにひっそり佇んでいるコード片のことを、ほんの少しでいいから思い出してみませんか? 書くコードを少なくして本質に向き合うきっかけや、はたまたGo標準の言語機能で代替されうるものなど、そこにはいろいろなドラマがあると思います。
小粒な記事でしたが、この記事が「ちょっとしたコード」について思いを馳せるきっかけになれば幸いです。
明日の記事は
id:r4wxii の【Jetpack Compose】PathMeasureを使ったPathのアニメーション - No one knows unknownsです。