Go でジェネリックスを不適切に使用すると、エラーが発生する可能性があります。型パラメータへのポインタは逆参照できません。具象型ポインタを使用する必要があります。ジェネリック型は非ジェネリック値と比較できず、リフレクションを使用して比較する必要があります。空のインターフェイスを誤って使用すると、実行時エラーが発生する可能性があるため、より具体的な型パラメータを使用する必要があります。
Go のジェネリックに関する一般的なエラーと解決策
Go は、バージョン 1.18 で導入された、広く使用されているプログラミング言語です。ジェネリックは強力なツールですが、使用を誤ると不可解なエラーが発生する可能性があります。この記事では、Go のジェネリックに関するよくある間違いとその修正方法について説明します。
エラー 1: 型パラメータへのポインタ
func Print[T any](ptr *T) { fmt.Println(*ptr) // 编译错误: 无效的指针解引用 }
このコードでは、Print
関数は T
型ポインタを受け取ります。 。ただし、T
は型パラメーターであり、具象型ではないため、このポインターを逆参照しようとするとコンパイル エラーが発生します。
解決策:
具象型ポインターを使用します:
func Print[T any](ptr *int) { fmt.Println(*ptr) // 成功打印 }
エラー 2: ジェネリック型と非ジェネリック値の比較
func Equals[T comparable](a, b T) bool { return a == b // 编译错误: 无效的类型比较 }
Equals
関数は、2 つのジェネリック型の要素を比較するように設計されています。ただし、Go での型比較は具象型に限定されます。
解決策:
リフレクションを使用して比較:
func Equals[T comparable](a, b T) bool { return reflect.DeepEqual(a, b) // 成功比较 }
エラー 3: 空のインターフェイスの不正使用
type MyMap[K comparable, V any] map[K]V func Merge[K comparable, V any](m MyMap[K, V], n MyMap[K, V]) MyMap[K, V] { for k, v := range n { m[k] = v // 运行时错误: 无效的类型断言 } return m }
Merge
この関数は、2 つのジェネリック型マップをマージしようとします。ただし、空のインターフェイス any
を使用すると、マップ内のキーと値のペアを具象型として正しくアサートできないため、実行時エラーが発生します。
解決策:
より具体的な型パラメータを使用します:
func Merge[K comparable, V int](m MyMap[K, V], n MyMap[K, V]) MyMap[K, V] { for k, v := range n { m[k] = v // 成功合并 } return m }
実際的なケース
仮定さまざまなタイプの要素を格納する必要があるリスト:
type List[T any] []T func main() { list := List[int]{1, 2, 3} fmt.Println(len(list)) // 成功打印元素数量 }
この例では、汎用リスト タイプ List
を定義します。要素の型を型パラメータとして渡すことで、int を格納するリストを簡単に作成し、その長さを計算できます。
これらのよくある間違いを避けることは、より堅牢で保守しやすい Go コードを作成するのに役立ちます。ジェネリックを慎重に使用し、ベスト プラクティスに従うことで、この強力な機能を最大限に活用できます。
以上がgolang のジェネリックに関する一般的なエラーと解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。