*(指针符号)在下面的 Go 方法中有什么不同?

我正在关注本教程:https : //github.com/astaxie/build-web-application-with-golang/blob/master/en/02.5.md。


我仍然不太了解指针,所以过去的事情让我有点困惑:func (h *Human) SayHi(). 我尝试删除*和输出结果完全相同。为什么*在这种情况下是必要的?有人可以用下面的代码给我一个不同输出的例子吗?


package main

import "fmt"


type Human struct {

    name string

    age int

    phone string

}


type Student struct {

    Human // anonymous field

    school string

}


type Employee struct {

    Human 

    company string

}


// define a method in Human

func (h *Human) SayHi() {

    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)

}


func main() {

    mark := Student{Human{"Mark", 25, "222-222-YYYY"}, "MIT"}

    sam := Employee{Human{"Sam", 45, "111-888-XXXX"}, "Golang Inc"}


    mark.SayHi()

    sam.SayHi()

}


POPMUISE
浏览 180回答 2
2回答

森林海

它的不同之处在于,该方法将在指向Human结构的指针上定义,并且该结构中的所有方法随后都会对指向的值进行操作。如果您要释放*,该方法将对您调用该方法的结构的副本进行操作,因此您对方法中的结构所做的任何写入对于调用该方法的代码都是无用的。由于方法体只执行 afmt.Printf并打印一些值,因此是否在指针上定义方法并没有太大区别。在某些情况下,为了并发安全,您最好不要在指针上定义方法,因为这可能会导致同时访问和写入底层结构值。

慕的地10843

使用指针接收器有两个原因:首先,为了避免在每次方法调用时复制值,如果值类型是大结构,效率会更高)。其次,该方法可以修改其接收者指向的值。因此,在您的示例中,如果您再添加一种转储方法来更改电话,如下所示:func (h Human) ChangePhone() {    h.phone = 'whatever'}调用此方法后,电话不会改变,这就是点*起作用的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go