我有一个结构说
type person struct{
name string
phone string
address string
}
我想把它转换为这个(修改电话和地址)我只有对象而不是结构。
type person2 struct {
name string
phone []struct {
value string
}
address []struct {
value string
}
}
如何基于我拥有的结构创建新结构?我只想转换选定的字段。
我研究了反射,但不知道从哪里开始/如何使用它。
前言:如果你只有类型person
而没有person2
,你必须先写person2
。Go 是静态类型语言,你不能只在运行时创建person2
。您可以手动编写person2
或通过自己编写生成器代码来使用go generate
,但这不会更简单。
你也可以使用类似map[string]interface{}
的东西来模仿动态结构,但这不会更友好,也不会更快。更不用说您必须使用类型断言,因为值类型interface{}
...
要从 person
的值创建 person2
的值,您不需要反射,只需手动编码即可:
func transform(p person) person2 {
return person2{
p.name,
[]struct{ value string }{{p.phone}},
[]struct{ value string }{{p.address}},
}
}
请注意,这可能看起来有点奇怪,这是因为您使用了匿名结构的一部分进行person2.phone
和person2.address
,并且要使用复合文本初始化匿名结构,必须重复匿名结构定义。
测试它:
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]}