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

  • 本文关键字:结构 修改 对象 go struct
  • 更新时间 :
  • 英文 :


我有一个结构说

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,并且要使用复合文本初始化匿名结构,必须重复匿名结构定义。

测试它:

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

最新更新