为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只萌萌小番薯 2021-12-27 15:12:09
我有一个结构说type person struct{    name string    phone string    address string}我想把它转换成这个(修改电话和地址)我只有对象而不是结构。type person2 struct {    name  string    phone []struct {        value string    }    address []struct {        value string    }}如何根据我拥有的结构创建新结构?我只想转换选定的字段。我研究了反射,但不知道从哪里开始/如何使用它。
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超6个赞

前言:如果你只有类型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.phoneand使用了匿名结构的切片person2.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]}


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号