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 类型的变量这两个方法都是拥有的。

results matching ""

    No results matching ""