型エイリアシングの複雑さの詳細を調べる
次のコード スニペットを考えてみましょう。
package main import ( "fmt" "time" ) type dur struct { time.Duration } type durWithMethods dur type durWithoutMethods time.Duration func main() { var d durWithMethods // works ?? fmt.Println(d.String()) var dWM durWithoutMethods fmt.Println(dWM.String()) // doesn't compile }
なぜ直接型を使用するのか考えるかもしれません。 time.Duration のエイリアス (durWithoutMethods) はメソッドを継承しませんが、ネストされた型のエイリアス (durWithMethods) は、それらへのアクセスを許可します。この混乱は、型定義と型エイリアスの根本的な違いから生じています。
新しい型の定義と既存の型の名前変更
Go では、型宣言は 2 つのカテゴリに分類されます。型定義と型エイリアス。型定義は、1 つ以上の既存の型を埋め込むことによって新しい型を生成します。これらは、入れ子になった型ではなく、トップレベルの埋め込み型からのみメソッドを継承します。
一方、型エイリアスは、新しい識別子を既存の型にバインドする単なる省略表現です。新しい型は作成されないため、基になる型は変更されません。基になる型に関連付けられたメソッドは、元の名前またはエイリアスのいずれかを介して引き続き簡単にアクセスできます。
durWithMethods について
durWithMethods 型は、効果的に dur 型を拡張します。それを埋め込むことです。 dur は time.Duration を埋め込むため、String() を含め、Duration のメソッドを継承します。したがって、コード内の d.String() は期待どおりに動作します。
durWithoutMethods の公開
durWithMethods とは異なり、durWithoutMethods は time.Duration の直接のエイリアスです。何も拡張しないため、プリミティブ time.Duration タイプのみで構成されます。 time.Duration のメソッドは、独自の別個のメソッド セットを持つ別個の型であるため、durWithoutMethods には転送されません。したがって、dWM.String() はコンパイルされません。
以上がGo の型エイリアスが埋め込み型から継承すると異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。