(*Point).ScaleBy
。这里的括号是必须的;没有括号的话这个表达式可能会被理解为*(Point.ScaleBy)
。(*Point).ScaleBy
,只要提供一个Point类型的指针即可,像下面这样。*Point
这样的接收器来调用Point的方法,因为我们可以通过地址来找到这个变量,只要用解引用符号*
来取到该变量即可。编译器在这里也会给我们隐式地插入*
这个操作符,所以下面这两种写法等价的:*T
:*T
,这种情况下编译器会隐式地为我们取变量的地址:*T
,实参是类型T。编译器会隐式地为我们解引用,取到指针指向的实际变量:*T
),那么拷贝这种类型的实例就是安全的;调用他的任何一个方法也就会产生一个值的拷贝。比如time.Duration的这个类型,在调用其方法时就会被全部拷贝一份,包括在作为参数传入函数的时候。但是如果一个方法使用指针作为接收器,你需要避免对其进行拷贝,因为这样可能会破坏掉该类型内部的不变性。比如你对bytes.Buffer对象进行了拷贝,那么可能会引起原始对象和拷贝对象只是别名而已,但实际上其指向的对象是一致的。紧接着对拷贝后的变量进行修改可能会有让你意外的结果。