如何将Item结构和所有指针复制到新结构?
type Item struct {
A []*ASet `json:"a,omitempty"`
B []*BSet. `json:"b,omitempty"`
C []*CSet. `json:"c,omitempty"`
}
type ASet struct {
UID string `json:"uid,omitempty"`
Items []*ItemA `json:"member,omitempty"`
}
type ItemA struct {
UID string `json:"uid,omitempty"`
Portset []*PortSet `json:"portset,omitempty"`
}
type PortSet struct {
UID string `json:"uid,omitempty"`
Ports []*Port `json:"member,omitempty"`
}
type Port struct {
UID string `json:"uid,omitempty"`
Port int `json:"port,omitempty"`
}
我不希望新结构引用旧结构。
本质上您想要的是标准库不支持的深层副本。
您的选择:
“手动”执行复制,例如,创建新的结构并复制字段,其中必须以递归方式手动复制指针或切片/地图/通道/等。
通过将您的结构分配给另一个可复制所有字段的结构,这是最容易做到的,因此,您基本上只需要培养指针/地图/切片等(但需要递归)。
使用外部库,例如github.com/mohae/deepcopy
,github.com/ulule/deepcopier
或github.com/mitchellh/copystructure
最后一个选项可能如下所示:
var i1 Item
data, err := json.Marshal(i1)
if err != nil {
panic(err)
}
var i2 Item
if err := json.Unmarshal(data, &i2); err != nil {
panic(err)
}
// i2 holds a deep copy of i1
请注意,封送/取消封送并不是特别有效,而是简单而紧凑的。还要注意,这可能无法很好地处理递归数据结构,甚至可能挂起或出现紧急情况(例如,字段指向包含的结构),但是处理递归结构可能是所有解决方案的问题。另请注意,这不会克隆未导出的字段。
关于封送处理/取消封送处理的好处是,您可以轻松创建一个辅助函数来深度复制“ any”值:
func deepCopy(v interface{}) (interface{}, error) {
data, err := json.Marshal(v)
if err != nil {
return nil, err
}
vptr := reflect.New(reflect.TypeOf(v))
err = json.Unmarshal(data, vptr.Interface())
if err != nil {
return nil, err
}
return vptr.Elem().Interface(), err
}
测试它:
p1 := image.Point{X: 1, Y: 2}
fmt.Printf("p1 %T %+v\n", p1, p1)
p2, err := deepCopy(p1)
if err != nil {
panic(err)
}
p1.X = 11
fmt.Printf("p1 %T %+v\n", p1, p1)
fmt.Printf("p2 %T %+v\n", p2, p2)
输出(在Go Playground上尝试):
p1 image.Point (1,2)
p1 image.Point (11,2)
p2 image.Point (1,2)
我想获得在AWS上创建的资源列表,并根据创建日期对它们进行排序。
对指针来说,解构(destructuring)和解引用(dereferencing)要区分开, 因为这两者的概念是不同的,和 C 那样的语言用法不一样。 解引用使用 * 解构使用 &,ref, 和 ref mut fn main() { // 获得一个 `i32` 类型的引用。`&` 表示获取一个引用。 let reference = &4; match reference
问题内容: 为什么当我们使用struct引用结构时,Go似乎会返回的新副本,而不是返回原始的相同地址?这可能是我的误解,所以我要求澄清 输出量 去操场 问题答案: 当你写 您正在复制(dereferences )指向的struct的值。它类似于: 所以是一个类型的新变量,被初始化为的值。这将导致具有不同的内存地址。 请注意,如果是type ,则while 是type 。但是它们是不同的值。更改of
本文向大家介绍C语言取消引用指针,包括了C语言取消引用指针的使用技巧和注意事项,需要的朋友参考一下 示例 要取消引用a_pointer并更改a的值,我们使用以下操作 可以使用以下打印语句对此进行验证。 但是,将一个NULL指针取消引用或其他无效指针将是错误的。这个 通常是未定义的行为。p1可能不会被取消引用,因为它指向的地址0xbad可能不是有效地址。谁知道那里有什么?它可能是操作系统内存,或另一
问题内容: 我最近才刚开始接触Go,我有一个主要的困惑点:我在努力理解何时确切需要显式取消引用指针。 例如,我知道运算符将处理对指针的解引用 在其他哪些情况下会这样做?例如,似乎使用数组。 我在规范中找不到此内容,指针部分很短,甚至没有提到取消引用。对取消引用go的指针的规则进行的任何澄清都将很棒! 问题答案: 所述选择器表达式(例如)这是否: 选择器会 自动取消引用 结构的 指针 。如果是指向结
我们有一个旧的playframework 1.2。x版本,我们将所有JAR复制到project/lib,以便playframework可以使用它们。我们也希望复制所有的源jar,这样当运行nig play eclipse时,我们就可以查看所有的第三方源。有没有办法让gradle做到这一点? 我的意思是当我运行gradle eclipse时下载的所有源代码罐,因为我看到它们下载了缓存位置。我们在一个