golang什么时候应该把方法绑定在struct的值上而不是指针上?
golang 支持 struct 也支持 struct 的指针。一个常见的困惑是既然struct 指针存在了,为什么不干脆只有struct的指针呢?两个原因:
同时struct应该也有助于escape analysis,使得对象可以分配在栈上,而不用去进行多线程争抢的分配堆上的内存。但是这只是一个猜想。 一个更有趣的问题是,什么时候方法应该绑定在struct上,而不是struct指针上?考虑以下测试程序 type MyStruct struct { field int } local_variable := MyStruct{1} fmt.Println(unsafe.Pointer(&local_variable)) local_variable.modify_struct_value() fmt.Println(local_variable) // {1} copied := local_variable.copy_my_self() fmt.Println(unsafe.Pointer(&copied)) func (self MyStruct) modify_struct_value() { fmt.Println(unsafe.Pointer(&self)) self.field = 2 } func (self MyStruct) copy_my_self() MyStruct { fmt.Println(unsafe.Pointer(&self)) return self } 执行的输出是 0xc82000a2c8 0xc82000a2e0 {1} 0xc82002a028 0xc82000a2f0 这个证明了几个事情
根据这样的行为,除非我们想让一个方法是类似c++的const的行为(以内存拷贝为代价),其他的场景下基本没有理由把行为绑定在struct上而不是绑定在struct指针上。 结论:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |