直接型エイリアスが Go のメソッドを継承しないのはなぜですか?

Linda Hamilton
リリース: 2024-11-19 09:54:03
オリジナル
133 人が閲覧しました

Why Doesn't a Direct Type Alias Inherit Methods in Go?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート