• 一个T类型的值可以调用为*T类型声明的方法,但是仅当此T的值是可寻址(addressable) 的情况下。编译器在调用指针属主方法前,会自动取此T值的地址。因为不是任何T值都是可寻址的,所以并非任何T值都能够调用为类型*T声明的方法。

  • 反过来,一个*T类型的值可以调用为类型T声明的方法,这是因为解引用指针总是合法的。事实上,你可以认为对于每一个为类型 T 声明的方法,编译器都会为类型*T自动隐式声明一个同名和同签名的方法。

哪些值是不可寻址的呢?

  • 字符串中的字节;

  • map 对象中的元素(slice 对象中的元素是可寻址的,slice的底层是数组);

  • 常量;

  • 包级别的函数等。

举一个例子,定义类型 T,并为类型 *T 声明一个方法 hello(),变量 t1 可以调用该方法,但是常量 t2 调用该方法时,会产生编译错误。

type T string

func (t *T) hello() {
    fmt.Println("hello")
}

func main() {
    var t1 T = "ABC"
    t1.hello() // hello
    const t2 T = "ABC"
    t2.hello() // error: cannot call pointer method on t
}

关于收费
微薄收入,仅用于维持服务器。本站模型区全部免费
关于VIP
VIP可以免费下载。月度、年度vip每天可免费下载9次,应该够用。终身vip每天可下载19次,右侧成为vip
注意,请不要重复点击某个资源的下载按钮,每次点击都会计入次数
资源失效处理
1、如果是蓝奏云,将下载链接中的lanzous换成lanzoux即可
2、如果是百度云失效了,那请点右侧发邮件给客服,或者在评论区指出,也可在菜单栏【有问必答】说明
3、如果是其他原因,请右侧按钮发邮件给我

发表评论