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

Go 如何从现有结构修改对象和结构?,go,struct,Go,Struct,我有句话要说 type person struct{ name string phone string address string } 我想把它转换成这个修改电话和地址,我只有对象,没有结构 如何在现有结构的基础上创建新结构?我只想变换选定的字段 我研究了反思,但不知道从哪里开始/如何使用它。前言:如果你只有person而没有person2,你必须先写person2。Go是静态类型语言,您不能在运行时创建person2。您可以手动编写person2,也可以通过自己编写

我有句话要说

type person struct{
    name string
    phone string
    address string
}
我想把它转换成这个修改电话和地址,我只有对象,没有结构

如何在现有结构的基础上创建新结构?我只想变换选定的字段

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

前言:如果你只有person而没有person2,你必须先写person2。Go是静态类型语言,您不能在运行时创建person2。您可以手动编写person2,也可以通过自己编写生成器代码来使用go generate,但不会更简单

您还可以使用类似map[string]interface{}的东西来模拟动态结构,但这不会更友好、更快。更不用说您必须使用类型断言,因为值类型是接口{}

要从person的值创建person2的值,您不需要反射,只需手动编写代码即可:

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)
请在以下服务器上尝试输出:

注:

请注意,您的人员2不必要地复杂。可以这么简单:

type person2 struct {
    name      string
    phones    []string
    addresses []string
}
然后转换为一行:

func transform(p person) person2 {
    return person2{p.name, []string{p.phone}, []string{p.address}}
}
请在以下服务器上尝试输出:

前言:如果你只有类型person而没有person2,你必须先写person2。Go是静态类型语言,您不能在运行时创建person2。您可以手动编写person2,也可以通过自己编写生成器代码来使用go generate,但不会更简单

您还可以使用类似map[string]interface{}的东西来模拟动态结构,但这不会更友好、更快。更不用说您必须使用类型断言,因为值类型是接口{}

要从person的值创建person2的值,您不需要反射,只需手动编写代码即可:

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)
请在以下服务器上尝试输出:

注:

请注意,您的人员2不必要地复杂。可以这么简单:

type person2 struct {
    name      string
    phones    []string
    addresses []string
}
然后转换为一行:

func transform(p person) person2 {
    return person2{p.name, []string{p.phone}, []string{p.address}}
}
请在以下服务器上尝试输出:


我没有Person2,我需要先使用Person生成它。除了少数需要转换的字段外,它基本上与Person相同。@user568109如果您还没有person2,但是您有Person,那么您必须首先编写person2。Go是静态类型的。你不能在运行时创建新类型。我使用的结构很大,所以我必须使用生成工具。任何关于如何使用它的指针。@user568109如果你只需要做一次,不管结构有多大,你最好还是手工做。go generate在您需要重复执行这类任务以及为许多不同的输入时非常方便。现在我将尝试一下。生成是一个长期的解决方案,因为我不控制原始结构本身,很难让它工作。我没有Person2,我需要先使用Person生成它。除了少数需要转换的字段外,它基本上与Person相同。@user568109如果您还没有person2,但是您有Person,那么您必须首先编写person2。Go是静态类型的。你不能在运行时创建新类型。我使用的结构很大,所以我必须使用生成工具。任何关于如何使用它的指针。@user568109如果你只需要做一次,不管结构有多大,你最好还是手工做。go generate在您需要重复执行这类任务以及为许多不同的输入时非常方便。现在我将尝试一下。generate是一个长期的解决方案,因为我不控制原始结构本身,很难让它工作。