[Go语言基础问题]为什么声明在指针上的方法可以通过地址变量赋值给对应的接口?
1. 运行环境#
go version go1.19 windows/amd64
2. 问题描述?#
我理解在 Go 语言中,通过原始类型的变量调用声明在指针类型上的方法或者通过指针变量调用声明在原始类型上的方法实际上是 Go 的语法糖,但是有这么一条规则我在学习的时候一直没理解原因是什么。
如下代码所示,我将 T 类型的变量 t 赋值给 I 接口类型的变量 i 是不可以的,因为 t 没有实现 M 方法,很好理解
package main
type T int
type I interface {
M()
}
func (t *T) M() {}
func main() {
var t T
var i I
i = t //无法赋值,提示t未实现M方法
}
但是为什么反过来,如果方法是声明在 T 类型上,赋值时使用指针就可以了
package main
type T int
type I interface {
M()
}
func (t T) M() {}
func main() {
var t T
var i I
i = &t //这是可以赋值,但是&t也没有实现M方法呀
}
推荐文章: