按照原文补充缺失的细节

This commit is contained in:
Xargin 2017-03-15 15:45:11 +08:00
parent 25d798e636
commit 07073a0b25

View File

@ -84,7 +84,7 @@ p.ScaleBy(2) // implicit (&p)
pptr.Distance(q) // implicit (*pptr)
```
如果类型T的所有方法都是用T类型自己来做接收器(而不是`*T`)那么拷贝这种类型的实例就是安全的调用他的任何一个方法也就会产生一个值的拷贝。比如time.Duration的这个类型在调用其方法时就会被全部拷贝一份包括在作为参数传入函数的时候。但是如果一个方法使用指针作为接收器你需要避免对其进行拷贝因为这样可能会破坏掉该类型内部的不变性。比如你对bytes.Buffer对象进行了拷贝那么可能会引起原始对象和拷贝对象只是别名而已但实际上其指向的对象是一致的。紧接着对拷贝后的变量进行修改可能会有让你意外的结果。
如果命名类型T(译注用type xxx定义的类型)的所有方法都是用T类型自己来做接收器(而不是`*T`)那么拷贝这种类型的实例就是安全的调用他的任何一个方法也就会产生一个值的拷贝。比如time.Duration的这个类型在调用其方法时就会被全部拷贝一份包括在作为参数传入函数的时候。但是如果一个方法使用指针作为接收器你需要避免对其进行拷贝因为这样可能会破坏掉该类型内部的不变性。比如你对bytes.Buffer对象进行了拷贝那么可能会引起原始对象和拷贝对象只是别名而已但实际上其指向的对象是一致的。紧接着对拷贝后的变量进行修改可能会有让你意外的结果。
**译注:** 作者这里说的比较绕,其实有两点: