インターフェースの型制約: 「型制約」エラーの理解と回避
Go では、インターフェースは一連のメソッドを定義する強力な構造体です。型は実装する必要があります。ただし、すべてのインターフェイスが同じように作成されているわけではありません。型制約を含むインターフェイスは、その使用法に追加の制限を課します。
次の型定義を考慮してください。
type Number interface { int | int64 | float64 }
このインターフェイスは、int、int64、または float64 のいずれかを表すことができる Number 型を定義します。ただし、Go 言語の仕様では、型パラメーター制約として以外のコンテキストで型要素を含むそのようなインターフェイスを使用することを明示的に禁止しています。
次のインターフェイスを使用しようとすると、コンパイラーは「インターフェイスに型制約が含まれています」というエラーを発生させます。他のシナリオの要素を入力します。たとえば、次のコード スニペットはコンパイルに失敗します:
type NumberSlice []Number // interface contains type constraints func main() { a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion }
このエラーは、Number が型制約のあるインターフェイスであるため、スライスの要素型として使用できないことが原因です。
型要素を持つインターフェイスと同様に、同等のインターフェイスまたは他の非基本インターフェイスが埋め込まれたインターフェイスも非基本です。これらのエラーを回避するには、インターフェイスにメソッドのみが含まれていることを確認するか、基本インターフェイスを埋め込んでください。
基本インターフェイスと非基本インターフェイスの例:
基本: メソッドのみ
type A1 interface { GetName() string }
基本: メソッドと基本インターフェイスの埋め込み
type B1 interface { A1 SetValue(v int) }
非基本: 同等の埋め込み
type Message interface { comparable Content() string }
非基本: 型要素 (共用体) があります
type Number interface { int | int64 | float64 }
非基本: 非基本インターフェイスが埋め込まれています
type SpecialNumber interface { Number IsSpecial() bool }
型制約のあるインターフェイスの正しい使用方法
型制約のあるインターフェイスは、型パラメーター制約としてのみ使用できます。例:
type Coordinates[T Number] struct { x, y T } func sum[T Number](a, b T) T { return a + b }
このシナリオでは、インターフェイスはジェネリック型と関数の許可される型を制限するために使用されます。
以上が型制約のあるインターフェイスが Go で禁止されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。