page contents

非接口非接口的任意类型 T() 都能够调用 *T 的方法吗?反过来呢?

轩辕小不懂 发布于 2021-09-10 14:41
阅读 1019
收藏 0
分类:Golang
1903
Nen
Nen
- 程序员

一个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

}

请先 登录 后评论