如果您想复制或克隆到不同的结构体,我建议使用deepcopier。它提供了很好的功能,如跳过、自定义映射和强制功能。您可以通过以下方式实现嵌套结构体的复制。
安装:
go get -u github.com/ulule/deepcopier
例子:
package main
import (
"fmt"
"strconv"
"github.com/ulule/deepcopier"
)
type FieldStruct struct {
Name string `deepcopier:"field:TargetName"`
Type string `deepcopier:"field:TargetType"`
}
type SourceStruct struct {
Name string `deepcopier:"field:TargetName"`
Age int `deepcopier:"field:TargetAge"`
StringArray []string `deepcopier:"field:TargetStringArray"`
StringToInt string `deepcopier:"context"`
Field FieldStruct
Fields []FieldStruct
}
type TargetFieldStruct struct {
TargetName string
TargetType string
}
type TargetStruct struct {
TargetName string
TargetAge int
TargetStringArray []string
TargetInt int
TargetField TargetFieldStruct
TargetFields []TargetFieldStruct
}
func (s *SourceStruct) TargetInt() int {
i, _ := strconv.Atoi(s.StringToInt)
return i
}
func main() {
s := &SourceStruct{
Name: "Name",
Age: 12,
StringArray: []string{"1", "2"},
StringToInt: "123",
Field: FieldStruct{
Name: "Field",
Type: "String",
},
Fields: []FieldStruct{
FieldStruct{
Name: "Field1",
Type: "String1",
},
FieldStruct{
Name: "Field2",
Type: "String2",
},
},
}
t := &TargetStruct{}
deepcopier.Copy(&t.TargetField).From(&s.Field)
for i := range s.Fields {
t.TargetFields = append(t.TargetFields, TargetFieldStruct{})
deepcopier.Copy(&t.TargetFields[i]).From(&s.Fields[i])
}
deepcopier.Copy(t).From(s)
fmt.Println(t)
}
输出:
&{名称 12 [1 2] 123 {字段 字符串} [{字段1 字符串1} {字段2 字符串2}]}