我正在关注本教程: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
并打印一些值,因此是否在指针上定义方法并没有太大区别。
在某些情况下,为了并发安全,您最好不要在指针上定义方法,因为这可能会导致同时访问和写入底层结构值。
慕的地10843
TA贡献1785条经验 获得超8个赞
使用指针接收器有两个原因:
首先,为了避免在每次方法调用时复制值,如果值类型是大结构,效率会更高)。
其次,该方法可以修改其接收者指向的值。
因此,在您的示例中,如果您再添加一种转储方法来更改电话,如下所示:
func (h Human) ChangePhone() {
h.phone = 'whatever'
}
调用此方法后,电话不会改变,这就是点*起作用的原因。
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报
0/150
提交
取消