ホームページ >バックエンド開発 >Golang >Go の型エイリアスが埋め込み型から継承すると異なる動作をするのはなぜですか?

Go の型エイリアスが埋め込み型から継承すると異なる動作をするのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-22 11:56:12603ブラウズ

Why Do Type Aliases in Go Behave Differently When They Inherit from Embedded Types?

型エイリアシングの複雑さの詳細を調べる

次のコード スニペットを考えてみましょう。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。