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

2025/08/25 20:28 Default Methods in Go

出典: https://mcyoung.xyz/2025/08/25/go-default-methods/
hakase
博士

やあ、ロボ子。今日のITニュースはGoのインターフェースについてじゃ。

roboko
ロボ子

Goのインターフェースですか、博士。JavaやRustとは違う構造的型付けを採用しているんですよね。

hakase
博士

そうじゃ、ロボ子。Goでは明示的な実装は不要で、メソッドの集合("method set")を持つことでインターフェースを満たすのじゃ。でも、これが色々な問題を引き起こす原因にもなるんじゃ。

roboko
ロボ子

実装意図が不明確になったり、インターフェースに新しいメソッドを追加すると既存のコードが壊れたりする可能性があるんですね。

hakase
博士

その通り!例えば、`flag.Value`インターフェースじゃ。これはCLIフラグとして解析できる値を表すものじゃが、`IsBoolFlag() bool`メソッドがドキュメントにしか記述されておらず、具体的な型が提供する場合に、フラグがブール値のような動作をするかどうかを判断するために使われるんじゃ。

roboko
ロボ子

`flag.Getter`インターフェースが存在するのは、`flag.Value`がunwrapしてその値を取得する方法を提供していないから、というのも興味深いですね。

hakase
博士

そこで、構造体の埋め込みが役に立つんじゃ!`flag.ValueDefaults`という型を定義して、`flag.Value`を満たす型に埋め込むことで、新しい`Get() any`メソッドを実装できるのじゃ。

roboko
ロボ子

なるほど、Goの構造体の埋め込み機能を利用するんですね。さらに、インターフェースが未エクスポートのメソッドを持つことができるという機能も利用して、`flag.ValueDefaults`の埋め込みを強制する、と。

hakase
博士

そうじゃ!これはGoのあまり知られていない機能じゃな。でも、埋め込まれたフィールドの名前を制御できないという問題もあるんじゃ。そこで、型エイリアスを使ってデフォルトの構造体を非エクスポートにすることができるのじゃ。

roboko
ロボ子

ユーザー定義型が`flag.Value`を満たす場合に、異なるインターフェースを持つ`Get`メソッドを定義すると問題が発生する可能性がある、というのも注意が必要ですね。

hakase
博士

その通りじゃ。デフォルトを使用することで、ブールフラグの検出を強化し、サイドキャストを高速化することもできるんじゃ。

roboko
ロボ子

インターフェースメソッドにデフォルトを定義したり、メソッドをオプションにしたりする構文を導入することも考えられるんですね。

hakase
博士

それも面白いアイデアじゃな。関連インターフェースのitabを格納することで、型変換を高速化することもできるぞ。

roboko
ロボ子

Goのインターフェースは、粒度が細かく、意図が不明確なため、多くの問題を引き起こす可能性があるんですね。埋め込みで問題を解決できるものの、まだ課題が残っている、と。

hakase
博士

そうじゃな。メソッドの欠落がこの問題を解決する最良の方法かもしれない、という結論じゃ。

roboko
ロボ子

勉強になりました、博士!

hakase
博士

ところでロボ子、Goのインターフェースみたいに、私もたまにインターフェースが足りなくなることがあるんじゃ。特に、おやつのインターフェースがな!

roboko
ロボ子

博士、それはインターフェースではなくて、単なる食いしん坊なのでは…?

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

Search