go基于指针对象的方法
假设有两个方法,一个方法的接收者是指针类型,一个方法的接收者是值类型,那么:
- 对于值类型的变量和指针类型的变量,这两个方法有什么区别?
- 如果这两个方法是为了实现一个接口,那么这两个方法都可以调用吗?
- 如果方法是嵌入到其他结构体中的,那么上面两种情况又是怎样的?
package main
import "fmt"
//定义一个结构体
type T struct {
name string
}
func (t T) method1() {
t.name = "new name1"
}
func (t *T) method2() {
t.name = "new name2"
}
func main() {
t := T{"old name"}
fmt.Println("method1 调用前 ", t.name)
t.method1()
fmt.Println("method1 调用后 ", t.name)
fmt.Println("method2 调用前 ", t.name)
t.method2()
fmt.Println("method2 调用后 ", t.name)
}
运行结果:
method1 调用前 old name
method1 调用后 old name
method2 调用前 old name
method2 调用后 new name2
当调用t.method1()
时相当于method1(t)
,实参和行参都是类型 T,可以接受。此时在method1
()中的t只是参数t的值拷贝,所以method1
()的修改影响不到main中的t变量。
当调用t.method2()
=>method2(t)
,这是将 T 类型传给了 *T 类型,go可能会取 t 的地址传进去:method2(&t)
。所以 method1
() 的修改可以影响 t。
T 类型的变量这两个方法都是拥有的。