Go ジェネリックの制限と考慮事項: 型変換: ジェネリック メソッドはインラインで型変換を実行できないため、明示的に変換する必要があります。型安全性: ジェネリックスは型チェックを提供しますが、型消去により潜在的な型安全性の問題が発生します。メモリ割り当て: ジェネリック メソッドと関数は型パラメータを持つ新しいオブジェクトを作成する場合があるため、メモリ割り当ての影響に注意する必要があります。実用的な例: 任意のタイプのスライスを比較します。汎用パラメータ T を使用します。これは比較可能なタイプである必要があります。 2 つのスライスを比較し、長さが異なるか要素が異なる場合は 1 を返します。
Go のジェネリックに関する制限と考慮事項
ジェネリックは、動作するコードを作成できるようにする Go 言語の重要な機能です。どのタイプでも。ただし、ジェネリックを使用する場合には、いくつかの制限と注意事項があることに注意してください。
型変換
ジェネリック メソッドまたは関数を使用する場合、型変換をインラインで実行することはできません。これは、型を必要な型に明示的にキャストする必要があることを意味します。例:
func Max[T any](a, b T) T { if a > b { return a } return b } var a float64 = 12.34 var b int = 5 result := Max(a, b) // 编译错误:无法转换类型 float64 为 int
このエラーを修正するには、a
を int
に明示的に変換する必要があります:
result := Max(a, int(b)) // 正确
タイプ セーフティ
ジェネリックは型チェックを提供しますが、絶対的な型の安全性を保証することはできません。これは、Go のジェネリックスが消去可能であるためです。つまり、型情報はコンパイル時に消去されます。例:
func Slice[T any](s []T) { // 请注意,这是不安全的,因为我们无法确保切片中元素的类型 s[0] = "hello" }
このコードでは、Slice
関数がスライス内の要素を変更します。ただし、スライス内のすべての要素が文字列型であることを保証することはできません。これにより、実行時にエラーが発生する可能性があります。
メモリ割り当て
ジェネリックスを使用する場合は、メモリ割り当てに注意する必要があります。これは、ジェネリック メソッドと関数が型パラメーターを使用して新しいオブジェクトを作成する場合があるためです。これにより、予測できないメモリ割り当てが発生する可能性があります。例:
func New[T any]() *T { return new(T) } func main() { var a *int = New() // 编译错误:分配具有空类型的指针 }
このコードでは、New
関数は null 型のポインターを作成します。これによりコンパイルエラーが発生します。
実際のケース: 任意の型のスライスの比較
ジェネリックスを使用した実際のケース、つまり任意の型の 2 つのスライスの比較を見てみましょう。
func CompareSlices[T comparable](a, b []T) int { if len(a) != len(b) { return 1 } for i := 0; i < len(a); i++ { if a[i] != b[i] { return 1 } } return 0 }
この関数は汎用パラメータ T
を使用します。これは同等の型である必要があります。この関数は 2 つのスライスを比較し、それらが等しいかどうかを示す整数を返します。
は等しいことを意味します
は等しくないことを意味します
a := []int{1, 2, 3} b := []string{"1", "2", "3"} result := CompareSlices(a, b) // result = 1 c := []float64{1.23, 4.56, 7.89} d := []float64{1.23, 4.56, 7.89} result = CompareSlices(c, d) // result = 0
以上がgolangにおけるジェネリックの制限と注意事項の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。