英文:
Deepcopying struct having pointer-to 0 value in golang
问题
我有一个在golang
中的结构体,如下所示:
type Test struct {
prop *int
}
当prop
是指向零值的指针时,我想要对结构体对象进行深拷贝。实际的结构体中还有很多其他字段,我想要对整个结构体对象进行深拷贝。我尝试使用gob
的编码-解码方式,但由于设计的后果,它会将指向0的指针转换为nil指针,详见这里。我还尝试使用reflect.Copy
,但它会引发错误panic: reflect: call of reflect.Copy on struct Value
。有没有更好的方法来深拷贝这样的结构体对象?
编辑:
我尝试使用json
编码/解码,它似乎可以工作。但我不知道它的缺点。
func DeepCopy(a, b interface{}) {
byt, _ := json.Marshal(a)
json.Unmarshal(byt, b)
}
对于这个解决方案有什么意见吗?
英文:
I have a struct in golang
as below
type Test struct {
prop *int
}
I want to take deepcopy of the struct object when prop
is pointer-to zero value. The real struct has lot more fields in it and I want deepcopy of entire struct obj. I tried to use gob
encode-decode way but it converts pointer-to 0 to nil pointer due to consequence of the design as mentioned here. I also tried to use reflect.Copy
but it panics with error panic: reflect: call of reflect.Copy on struct Value
. Is there a better way to deepcopy such struct objects?
EDIT:
I tried to use json
encoding/decoding and it kind of worked. But I don't know its drawbacks.
func DeepCopy(a, b interface{}) {
byt, _ := json.Marshal(a)
json.Unmarshal(byt, b)
}
Any comments on this solution?
答案1
得分: 1
我使用了https://github.com/mohae/deepcopy/blob/master/deepcopy.go作为示例。
reflect.Copy只适用于切片或数组。
正如你所看到的,使用反射是正确的方法,但它比简单调用reflect.Copy更复杂。还有一些其他的包实现了深拷贝,但我对这些包没有任何经验。
- https://github.com/jinzhu/copier
- https://github.com/mohae/deepcopy
- https://github.com/ulule/deepcopier
- https://github.com/mitchellh/copystructure
英文:
https://play.golang.org/p/fVKW62BYDm
I used https://github.com/mohae/deepcopy/blob/master/deepcopy.go for the example.
reflect.Copy only works for slices or arrays.
As you can see, using reflection is the right way, but it is more complex than simply calling reflect.Copy. There are a few other packages, that implement a deep copy, but I don't have any experience with any of those packages.
答案2
得分: 0
截至目前,我正在使用JSON编码/解码解决方案,并且它运行良好。
func DeepCopy(a, b interface{}) {
byt, _ := json.Marshal(a)
json.Unmarshal(byt, b)
}
我听说可能的缺点有:
- 它有点慢
- 在结构体中使用JSON标签
- 只复制公共成员
但是目前没有任何问题影响到我。所以在我找到比这更好的解决方案之前,我将把这个设为答案。
英文:
As of now, I am using the json encoding/decoding solution and it is working well.
func DeepCopy(a, b interface{}) {
byt, _ := json.Marshal(a)
json.Unmarshal(byt, b)
}
I heard the possible disadvantages are:
- it is kind of slow
- uses json-tags in struct
- only copies public members
But none of them are affecting me right now. So I am setting this as answer until I get anything better solution than this.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论