Does assigning value to interface copy anything?
我一直在努力围绕Go中接口的概念。 阅读此内容对此有很大帮助。
唯一让我感到不适的是语法。 看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import"fmt" type Interface interface { String() string } type Implementation int func (v Implementation) String() string { return fmt.Sprintf("Hello %d", v) } func main() { var i Interface impl := Implementation(42) i = impl fmt.Println(i.String()) } |
我的问题是
1 2 3 4 5 6 7 8 | func main() { var i Interface impl := Implementation(42) i = impl fmt.Println(i.String()) impl = Implementation(91) fmt.Println(i.String()) } |
(游乐场链接)
您会发现第二个
1 2 3 4 5 6 | func (v *Implementation) String() string { return fmt.Sprintf("Hello %d", *v) } // ... i = &impl |
如果要接口保留指向
否则它将是指向某些数据的指针,但这是棘手的部分:如果实现接口的类型是struct,则指针将指向该结构的副本,而不是分配给接口变量本身的结构。或至少在语义上用户可以这样认为,优化可能会导致在两个值分开之前(例如,直到您调用
简而言之:分配给接口可以在语义上被认为是实现接口的数据的副本。如果这是指向类型的指针,则复制该指针,如果是大结构,则复制该大结构。在后台使用指针的接口的详细信息是出于垃圾收集的原因,并确保堆栈以可预测的数量扩展。就开发人员而言,应将它们视为分配的实现类型的特定实例的语义副本。