Go の型エイリアスについて
Go では、型エイリアスがわかりにくい場合があります。次のコードはこれを例示しています。
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 }
なぜ、durWithMethods とは異なり、直接エイリアス durWithoutMethods はメソッドを継承しないのですか?
型宣言とエイリアス
これを理解するには、型宣言と型エイリアスを区別する必要があります。型宣言は新しい型を作成し、その基になる型からすべてのメソッドを削除します。一方、型エイリアスは、新しい識別子を既存の型にバインドするだけです。
メソッド解決
durWithMethods の場合、新しい型 durWithMethods は次のとおりです。基礎となる型として du を使用して作成されます。 dur は time.Duration を埋め込むため、time.Duration のメソッドは dur に昇格されます。したがって、d.String() は、短縮表現 d.Duration.String() を使用して呼び出すことができます。
メソッドの除去
ただし、durWithoutMethods では、直接エイリアスtime.Duration の場合、すべてのメソッドが削除されます。 Duration.String() は time.Duration のメソッドであるため、durWithoutMethods には継承されません。
True Type Aliases
もう一方の True Type エイリアスhand は = 記号を使用して表されます:
type sameAsDuration = time.Duration
これにより、次のエイリアスが作成されます。ストリッピング方法を使用しない場合の時間。したがって、sad.String() は d.String().
と同様に呼び出すことができます。以上が直接型エイリアスが Go のメソッドを継承しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。