"fieldtrack"实验包括一个//go:nointerface
指令,表示不应将方法视为接口满足性。例如,这个包在GOEXPERIMENT=fieldtrack
下无法编译:
package p
type T int
//go:nointerface
func (*T) M() {}
type I interface { M() }
var i I = new(T) // ERROR: *T does not implement I, because (*T).M is marked //go:nointerface
//go:nointerface
应该对类型参数约束满足性产生什么影响?*T
是否应作为类型参数约束满足I
?编译器应如何处理:
package p
type T int
//go:nointerface
func (*T) M() {}
type I interface { M() }
func F[X I]() {
var _ I = new(X)
}
var _ = F[T]
Fieldtracking正式只是一个实验,因此我认为支持任何一方(即,如果允许,则接受并正确处理,如果不允许,则始终拒绝)都不是紧急的。我还认为我们有权改变我们对此行为的看法。但似乎值得确保我们在长期方向上基本一致。
我目前倾向于认为,如果(*T).M
是//go:nointerface
,则*T
不满足约束interface { M() }
。(这在cmd/compile中实现起来有点麻烦,因为目前types2负责约束满足性,但它不知道像//go:nointerface
这样的指令;但我认为处理起来不应该那么困难。)
/cc @griesemer@ianlancetaylor@findleyr
4条答案
按热度按时间ppcbkaq51#
https://golang.org/cl/332611提到了这个问题:
[dev.typeparams] cmd/compile: fix unified IR support for //go:nointerface
6mzjoqzu2#
我认为我们不知道
go:nointerface
应该对约束做些什么。转到1.19里程碑。wpcxdonn3#
由于类型参数约束只是接口,我认为没有接口方法不满足它们,就像它们不满足常规接口一样。
gojuced74#
将文本内容移动到待办事项列表中。