为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
POPMUISE 2021-09-10 21:03:42
我正在关注本教程:https : //github.com/astaxie/build-web-application-with-golang/blob/master/en/02.5.md。我仍然不太了解指针,所以过去的事情让我有点困惑:func (h *Human) SayHi(). 我尝试删除*和输出结果完全相同。为什么*在这种情况下是必要的?有人可以用下面的代码给我一个不同输出的例子吗?package mainimport "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 Humanfunc (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()}
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

它的不同之处在于,该方法将在指向Human结构的指针上定义,并且该结构中的所有方法随后都会对指向的值进行操作。

如果您要释放*,该方法将对您调用该方法的结构的副本进行操作,因此您对方法中的结构所做的任何写入对于调用该方法的代码都是无用的。

由于方法体只执行 afmt.Printf并打印一些值,因此是否在指针上定义方法并没有太大区别。

在某些情况下,为了并发安全,您最好不要在指针上定义方法,因为这可能会导致同时访问和写入底层结构值。


查看完整回答
反对 回复 2021-09-10
?
慕的地10843

TA贡献1785条经验 获得超8个赞

使用指针接收器有两个原因:


首先,为了避免在每次方法调用时复制值,如果值类型是大结构,效率会更高)。

其次,该方法可以修改其接收者指向的值。

因此,在您的示例中,如果您再添加一种转储方法来更改电话,如下所示:


func (h Human) ChangePhone() {

    h.phone = 'whatever'

}

调用此方法后,电话不会改变,这就是点*起作用的原因。


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信