Goのバージョン: 1.17.2
2021/10/24追記: 最新のmasterブランチで確認したところ、1.18では修正されて正常にビルドできそうです。
Go1.17を使用して、 -gcflags=-G=3
を使ってジェネリクスの機能をonにしてビルドする際に
ジェネリクスな関数の中で、ジェネリクエスな引数を取るジェネリクスな関数を 匿名関数の中で呼ぶ場合に起きる(?)っぽい。
どうするか
問題のコード
package main
func a[T any](t T){}
func b[T any](t T) {
func () {
a[T](t)
}()
}
func main() {
b[int](0)
}
修正したコード
package main
func a[T any](t T){}
func b[T any](t T) {
a := a[T]
func () {
a(t)
}()
}
func main() {
b[int](0)
}
ジェネリクスな関数を呼ぶ前に、変数に型パラメータまで指定した関数を変数として確保して、匿名関数ではその変数を指定して呼び出せば良い。
どういうエラーがでるのか
問題のコード
package main
func a[T any](t T){}
func b[T any](t T) {
func () {
a[T](t)
}()
}
func main() {
b[int](0)
}
$ go build -gcflags=-G=3 .
main.b[int]: relocation target main.a[T₂] not defined
どういう理由でエラーが起きてるのかちょっとわかりませんが、多分 main.a[T₂]
というシンボルを解決できないみたいなエラーだと思います。
ただ、なんでこのエラーが起きてるかはわかりませんでした。