为了账号安全,请及时绑定邮箱和手机立即绑定

在方法声明中将 _ 用于多个类型参数时出现“无法使用 .this”错误

在方法声明中将 _ 用于多个类型参数时出现“无法使用 .this”错误

Go
智慧大石 2022-10-24 15:01:00
我正在使用 Go 处理类型参数(泛型)1.18beta1。问题考虑以下代码段:package mainimport (    "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 mainimport (    "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 mainimport (    "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)}
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

正如问题评论中提到的,所描述的行为是 Go 1.18beta1 中的一个错误,并由issue 50419跟踪。

编辑

我已确认该错误已在2022 年 1 月 31 日发布的1.18beta2中修复。


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信