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

时间:2016-03-21 06:00:43

标签: go struct

我有一个结构说

type person struct{
    name string
    phone string
    address string
}

我希望将其转换为此(修改手机和地址)我只有对象而不是结构。

type person2 struct {
    name  string
    phone []struct {
        value string
    }

    address []struct {
        value string
    }
}

如何基于我拥有的结构创建新结构?我只想转换选定的字段。

我研究了反思,但不知道从哪里开始/如何使用它。

1 个答案:

答案 0 :(得分:4)

前言:如果您只有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.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]}