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是一个长期的解决方案,因为我不控制原始结构本身,很难让它工作。