ホームページ >バックエンド開発 >Golang >Go の汎用コードが「*T 型の変数を引数の型として使用できません」というエラーで失敗するのはなぜですか?

Go の汎用コードが「*T 型の変数を引数の型として使用できません」というエラーで失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 20:34:21904ブラウズ

Why Does Go's Generic Code Fail with

ジェネリック コードのエラーを理解する

Go では、ジェネリックを使用する際の一般的なエラーは、試行時に「型 *T の変数を引数の型として使用できません」です。ジェネリック型へのポインターを関数に渡します。これは、ジェネリック型パラメーター T が、それを制限するために使用される制約型と同等ではないために発生します。

型制約について

提供されたコードでは、インターフェイス FooBar は 2 つの和集合として定義されています。 foo 型と bar 型。これは、メソッド a() string を実装する任意の型を FooBar インターフェイスに割り当てることができることを意味します。ただし、関数 blah で使用されるジェネリック型パラメーター T は、暗黙的に FooBar と同等ではありません。

ポインターへのメソッドの実装

さらに、型 foo および bar のメソッドはポインター レシーバーに実装されます。 (foo と bar)。これは、メソッド a() 文字列が実際には型自体ではなく、これらの型へのポインターに対して定義されていることを意味します。

エラーの解決

エラーを解決するには、次のいずれかをアサートする必要があります。ジェネリック型パラメーター T は、ストリンガー インターフェイスを実装するか、制約自体で型の共用体を明示的に定義します。

Asserting Stringer実装

func blah[T FooBar]() {
    t := new(T)
    do(any(t).(stringer))
}

ただし、このアプローチでは型安全性が無視され、実行時パニックが発生する可能性があります。

明示的に共用体を定義する

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}

このアプローチでは型安全性が維持され、次のことが可能になります。ジェネリック型パラメータ T を非 nil に初期化する必要があります。 value.

結論

Go でジェネリックを効果的に使用するには、ジェネリック型パラメーターとその制約の関係を理解することが重要です。インターフェイスと制約を慎重に定義することで、型安全性を強化し、実行時エラーを回避できます。

以上がGo の汎用コードが「*T 型の変数を引数の型として使用できません」というエラーで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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