我有一个结构说
type person struct{
name string
phone string
address string
}
我希望将其转换为此(修改手机和地址)我只有对象而不是结构。
type person2 struct {
name string
phone []struct {
value string
}
address []struct {
value string
}
}
如何基于我拥有的结构创建新结构?我只想转换选定的字段。
我研究了反思,但不知道从哪里开始/如何使用它。
答案 0 :(得分:4)
前言:如果您只有person
类型而不是person2
,则必须先写person2
。 Go是静态类型语言,您不能只在运行时创建person2
。您可以手动编写person2
或通过自己编写生成器代码来使用go generate
,但这不会更简单。
您还可以使用类似map[string]interface{}
的内容来模仿动态结构 ,但这不会更友好也更快。更不用说你必须使用类型断言,因为值类型是interface{}
...
要从值person2
创建person
的值,您不需要反射,只需手动编码即可:
func transform(p person) person2 {
return person2{
p.name,
[]struct{ value string }{{p.phone}},
[]struct{ value string }{{p.address}},
}
}
请注意,这可能看起来有点奇怪,那是因为您使用了person2.phone
和person2.address
的匿名结构片段,并使用composite literal初始化了一个匿名结构,必须重复匿名结构定义。
测试它:
p := person{"Bob", "1234", "New York"}
fmt.Println(p)
p2 := transform(p)
fmt.Println(p2)
输出(在Go Playground上尝试):
{Bob 1234 New York}
{Bob [{1234}] [{New York}]}
注意:强>
请注意,您的person2
不必要地复杂。它可以这么简单:
type person2 struct {
name string
phones []string
addresses []string
}
然后转变是一个单行:
func transform(p person) person2 {
return person2{p.name, []string{p.phone}, []string{p.address}}
}
输出(在Go Playground上尝试):
{Bob 1234 New York}
{Bob [1234] [New York]}