ホームページ  >  記事  >  バックエンド開発  >  型エイリアスは埋め込み型からメソッドを継承するのに、生の型からメソッドを継承しないのはなぜですか?

型エイリアスは埋め込み型からメソッドを継承するのに、生の型からメソッドを継承しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-16 09:50:03324ブラウズ

Why does a type alias inherit methods from an embedded type but not from a raw type?

メソッド継承に対する型エイリアスの影響を理解する

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
}

このコードでは、dur、durWithMethods、および durWithoutMethods の 3 つの型を宣言します。型 dur は、構造体埋め込み時間.Duration です。タイプ durWithMethods は、dur のエイリアスとして定義されます。一方、型 durWithoutMethods は time.Duration のエイリアスです。

なぜ durWithMethods は time.Duration から String() メソッドを継承するのに、durWithoutMethods は継承しないのかという疑問が生じます。

型宣言とメソッド継承

Go では、型宣言は型定義と型エイリアスの 2 つのカテゴリに分類されます。

  • 型定義 新しい型を作成し、継承されたメソッドを破棄します。 .
  • 型別名 は単に新しい識別子をバインドするだけです

この場合、dur は型定義ですが、durWithMethods と durWithoutMethods は両方とも型エイリアスです。

メソッド継承への影響

dur などの型定義を使用して新しい型が作成されると、継承されたすべてが失われます方法。これは、dur が本質的に time.Duration の String() メソッドを持っていないことを意味します。ただし、durWithMethods などの型エイリアスを使用して新しい型が作成されると、基になる型のすべてのメソッド (この場合は dur.

Time.Duration および Raw Types

time.Duration は生の型であり、メソッドを持つことができないことを意味します。ただし、dur のような構造体内に埋め込むことができ、構造体がそのメソッドを継承できるようになります。

型エイリアスと直接エイリアス

durWithoutMethods は直接エイリアスです。時間。期間。この型の除去動作は直接エイリアスに固有であり、durWithMethods のような型エイリアスには適用されません。

結論として、durWithMethods は time.Duration の String() メソッドを継承しますが、これは時間を埋め込む型のエイリアスであるためです。 .Duration、durWithoutMethods は、生の型の直接のエイリアスであるため、このメソッドを継承しません。

以上が型エイリアスは埋め込み型からメソッドを継承するのに、生の型からメソッドを継承しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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