gpt4 book ai didi

go - 如何从现有结构修改对象和结构?

转载 作者:IT王子 更新时间:2023-10-29 01:55:01 27 4
gpt4 key购买 nike

我有一个结构说

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.phoneperson2.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]}

关于go - 如何从现有结构修改对象和结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36124108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com