1 回答
TA贡献1993条经验 获得超6个赞
前言:如果你只有类型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.phoneand使用了匿名结构的切片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]}
- 1 回答
- 0 关注
- 198 浏览
添加回答
举报
