我正在使用 Go 处理类型参数(泛型)1.18beta1。
问题
考虑以下代码段:
package main
import (
"fmt"
)
func main() {
foo := &Foo[string, int]{
valueA: "i am a string",
valueB: 123,
}
fmt.Println(foo)
}
type Foo[T1 any, T2 any] struct {
valueA T1
valueB T2
}
func (f *Foo[_,_]) String() string {
return fmt.Sprintf("%v %v", f.valueA, f.valueB)
}
此代码段无法构建,并出现以下错误:
<autogenerated>:1: cannot use .this (type *Foo[string,int]) as type *Foo[go.shape.string_0,go.shape.string_0] in argument to (*Foo[go.shape.string_0,go.shape.int_1]).String
由于Type Parameters Proposal_中的以下语句,我尝试在方法声明中使用:
方法声明中列出的类型参数不必与类型声明中的类型参数具有相同的名称。特别是,如果方法不使用它们,它们可以是_。
问题
上面的构建错误是错误1.18beta1还是我遗漏了什么?
成功构建的片段变体
使用类型参数名称
String如果我将方法声明更改为以下内容(替换为_实际类型参数),我可以成功构建代码:
func (f *Foo[T1,T2]) String() string {
return fmt.Sprintf("%v %v", f.valueA, f.valueB)
}
单一类型参数
_仅使用单个类型参数时,我设法成功使用:
package main
import (
"fmt"
)
func main() {
foo := &Foo[string]{"i am a string"}
fmt.Println(foo)
}
type Foo[T1 any] struct {
value T1
}
func (f *Foo[_]) String() string {
return fmt.Sprintf("%v", f.value)
}
为 T1 和 T2 实例化具有相同类型的 Foo
_Foo如果用相同的类型实例化(例如string,对于T1和) ,也适用于方法声明T2:
package main
import (
"fmt"
)
func main() {
foo := &Foo[string, string]{
valueA: "i am a string",
valueB: "i am also a string",
}
fmt.Println(foo)
}
type Foo[T1 any, T2 any] struct {
valueA T1
valueB T2
}
func (f *Foo[_,_]) String() string {
return fmt.Sprintf("%v %v", f.valueA, f.valueB)
}
月关宝盒
相关分类