Go では、言語に null 値がないため、空の値またはデフォルト値を返すときに問題が発生します。ジェネリック型。
検討次の汎用リスト実装:
type mylist[T any] struct { first *node[T] } type node[T any] struct { data T next *next[T] }
この例では、リストから最初の要素をポップおよび取得するためのメソッドを定義します:
func (list *mylist[T]) pop() T { if list.first != nil { data := list.first.data list.first = list.first.next return data } return nil } func (list *mylist[T]) getfirst() T { if list.first != nil { return list.first.data } return nil }
ただし、このコードをコンパイルするときは、コンパイラは、「return ステートメントでは T 値として nil を使用できません」というエラーを生成します。これは、Go がジェネリック型変数 T に暗黙的に nil を代入できないために発生します。
nil を返す代わりに、使用される特定の型 T のゼロ値を返すことができます。一般的なリストにあります。ゼロ値は次のとおりです。
これを実現するには、型 T の変数を宣言し、次の値を返します。 it:
func getZero[T any]() T { var result T return result }
この関数を使用して、任意のジェネリック型のゼロ値を返すことができるようになりました。たとえば、さまざまな型に対してテストできます:
i := getZero[int]() fmt.Printf("%T %v\n", i, i) s := getZero[string]() fmt.Printf("%T %q\n", s, s) p := getZero[image.Point]() fmt.Printf("%T %v\n", p, p) f := getZero[*float64]() fmt.Printf("%T %v\n", f, f)
出力:
int 0 string "" image.Point (0,0) *float64 <nil>
このソリューションを使用すると、Go の任意のジェネリック型に対して適切なデフォルト値または空の値を返すことができます。
以上がGo でジェネリック型のデフォルト値の戻り値を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。