ホームページ > バックエンド開発 > Golang > Go ジェネリック型に異なる引数を割り当てられないのはなぜですか?

Go ジェネリック型に異なる引数を割り当てられないのはなぜですか?

Susan Sarandon
リリース: 2024-12-20 05:56:10
オリジナル
125 人が閲覧しました

Why Can't I Assign Go Generic Types with Different Arguments?

異なる引数によるジェネリック型の代入

Go では、ジェネリック インターフェイスと実装では、異なる型引数間での直接代入は許可されません。

考えてみましょう単純化した例:

// Abstract
type Generic interface {
    ID() string
}

type Props[G Generic] struct{}

// Example
type Example struct {
    id string
}

func (example Example) ID() string {
    return example.id
}

var ExampleProps = Props[Example]{}

// Problem
func Problem() Props[Generic] {
    return ExampleProps
}
ログイン後にコピー

このコードはコンパイル エラーをスローしますreturn ステートメントで Props[Example] を Props[Generic] に割り当てることはできないことを示しています。これは、異なる型引数を使用してジェネリック型をインスタンス化するときに、Go が個別の名前付き型を作成するためです。

次の関数を考えてみましょう:

func Problem() Props[Generic] {
    return ExampleProps
}
ログイン後にコピー

型引数として Generic を使用して Props をインスタンス化します。その結果、たとえ Example が Generic を実装していても、Props[Example] と Props[Generic] は 2 つの異なる型になります。したがって、型パラメーターに関係なく、Props[Example] を Props[Generic] に割り当てることは無効です。

この問題を解決するには、1 つのオプションは、Generic 制約を満たす型パラメーターを使用して Props をインスタンス化することです。

// adding a field to make this a bit less contrived
type Props[G Generic] struct{ Value G }

// Props instantiated with T, adequately constrained
func Problem[T Generic](v T) Props[T] {
    return Props[T]{ Value: v }
}

func main() {
    a := Problem(Example{})
    fmt.Println(a)
}
ログイン後にコピー

この例では、Generic インターフェイスに準拠する型パラメーター T を使用して Props がインスタンス化されます。これにより、Props[Example] 型の値を Props[Generic] に割り当てることが可能になり、型の安全性が確保されます。

以上がGo ジェネリック型に異なる引数を割り当てられないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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