给定:
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
5条答案
按热度按时间cnh2zyt31#
看起来当前规范的措辞非常明确地禁止了这种做法:
https://go.dev/ref/spec#Interface_types:
接口类型T不能直接或间接地嵌入包含T的类型元素。
// 非法:Bad3不能嵌入包含Bad3的联合体
type Bad3 interface {
~int | ~string | Bad3
}
但我不明白为什么在这种情况下有必要限制这个规定,因为s.i是一个普通的命名字段。
deyfvvtc2#
规范规则似乎没有被精确地拼写出来。循环检查中可能存在一个错误。虽然不紧急,但已添加到我的任务列表中。感谢你的报告。
myss37ts3#
1.21太晚了。
gwbalxhn4#
太晚了,1.23版本已经过时。现在转到1.24版本。
ijxebb2r5#
这个问题目前被标记为Go 1.24的早期阶段。
那个time is now,所以请友好地提醒大家再次查看它。