go/types: 似是而非的 "无效的递归类型" 错误?

x0fgdtte  于 3个月前  发布在  Go
关注(0)|答案(5)|浏览(42)

给定:

package p

type s struct { i i }
type i interface { s | any }

go/types 目前报告:

/tmp/y.go:3:6: invalid recursive type s
/tmp/y.go:3:6: 	s refers to
/tmp/y.go:4:6: 	i refers to
/tmp/y.go:3:6: 	s

值得注意的是,将字段类型从 i 更改为 *i 可以使错误消失。但我不明白这为什么会有区别。
在尝试编写 #60117 的额外测试用例时构造的合成测试用例。
/cc @adonovan@findleyr@griesemer@ianlancetaylor

cnh2zyt3

cnh2zyt31#

看起来当前规范的措辞非常明确地禁止了这种做法:
https://go.dev/ref/spec#Interface_types:
接口类型T不能直接或间接地嵌入包含T的类型元素。
// 非法:Bad3不能嵌入包含Bad3的联合体
type Bad3 interface {
~int | ~string | Bad3
}
但我不明白为什么在这种情况下有必要限制这个规定,因为s.i是一个普通的命名字段。

deyfvvtc

deyfvvtc2#

规范规则似乎没有被精确地拼写出来。循环检查中可能存在一个错误。虽然不紧急,但已添加到我的任务列表中。感谢你的报告。

gwbalxhn

gwbalxhn4#

太晚了,1.23版本已经过时。现在转到1.24版本。

ijxebb2r

ijxebb2r5#

这个问题目前被标记为Go 1.24的早期阶段。
那个time is now,所以请友好地提醒大家再次查看它。

相关问题