我有一个结构说
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{}
...
要创建的值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
,并使用复合文字初始化了一个匿名结构,因此必须重复该匿名结构定义。
测试它:
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]}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句