Go でジェネリック型のデフォルト値を返す
Go では、どうすればジェネリック型 T のデフォルト値を返すことができますか?次のコードを考えてみましょう:
type mylist[T any] struct { first *node[T] } type node[T any] struct { data T next *node[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 }
このコードをコンパイルしようとすると、次のエラーが発生する可能性があります:
cannot use nil as T value in return statement
Nil を返す問題
Go ではジェネリック型に対して nil を返すことは許可されていません。これは、nil がすべての型に対して有効な値ではないためです。たとえば、T が整数の場合、nil を返しても意味がありません。同様に、nil は構造体の有効な値ではありません。
ゼロ値を返す
nil を返す代わりに、構造体に使用される型引数のゼロ値を返す必要があります。 T. ゼロ値はポインタとスライスの場合は nil、文字列の場合は空の文字列、整数と浮動小数点の場合は 0 です。
ゼロ値を返すには、T 型の変数を宣言してそれを返すことができます。
func getZero[T any]() T { var result T return result }
ゼロ値関数のテスト
これは getZero をテストする方法の例ですfunction:
package main import "fmt" func main() { 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) }
Output:
int 0 string "" image.Point {0, 0} *float64 <nil>
これは、getZero 関数がさまざまな型に対して期待されるゼロ値を返すことを示しています。
以上がGoでジェネリック型のデフォルト値を返す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。