golang中值类型/指针类型的差异

golang中值类型/指针类型的差异,go,Go,为什么当我使用var tf intf=&t1时,它是正确的 但是当我使用var tf intf=&t1时,它是不正确的 这两种表述有什么不同吗 当我使用var-tf-intf=&t1时,它是正确的,但当我使用var-tf-intf=&t1时,它不是 因为在您的示例中,您使用的是tf intf=t1,并且它没有编译,所以我认为您的意思可能是: 当我使用var-tf-intf=&t1时,它是正确的,但当我使用var-tf-intf=t1时,它不是 所以这里的问题是为什么&T{t1}指针满足接口int

为什么当我使用var tf intf=&t1时,它是正确的 但是当我使用var tf intf=&t1时,它是不正确的 这两种表述有什么不同吗

当我使用var-tf-intf=&t1时,它是正确的,但当我使用var-tf-intf=&t1时,它不是

因为在您的示例中,您使用的是tf intf=t1,并且它没有编译,所以我认为您的意思可能是:

当我使用var-tf-intf=&t1时,它是正确的,但当我使用var-tf-intf=t1时,它不是

所以这里的问题是为什么&T{t1}指针满足接口intf而T{t1}值不满足

在您的示例中,接口有两种方法M1和M2

类型T实现两种方法,但:

M1具有T值作为接收器 M2使用T指针作为接收器 <>为什么编译器考虑T指针来实现这两种方法,但是认为T值不?

可在规范中找到答案:

任何其他类型T的方法集由使用接收器类型T声明的所有方法组成。相应指针类型*T的方法集是使用接收器*T或T声明的所有方法集,也就是说,它还包含方法集T

该规范说,T指针具有使用接收器T和*T定义的所有方法,因此在本例中M1和M2都是如此

但是T的值只有接收器T定义的方法,因此在这种情况下只有M1


由于接口具有这两种方法,因此只有指针可以实现它。

我怀疑您为什么键入了x而不是y示例,因为它们都是相同的。
type T struct {
    Name string
}
func (t T) M1 () {
    t.Name = "name1"
}
func (t *T) M2 () {
    t.Name = "name2"
}
type intf interface {
    M1()
    M2()
}
func main() {
    var t1 T = T{"t1"}
    t1.M1()
    t1.M2()
    var t2 intf = t1
    t2.M1()
    t2.M2()
}