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

迭代时更改值

迭代时更改值

一只萌萌小番薯 2019-11-11 14:47:32
假设我有以下几种类型:type Attribute struct {    Key, Val string}type Node struct {    Attr []Attribute}我想迭代节点的属性以更改它们。我本来希望能够做到:for _, attr := range n.Attr {    if attr.Key == "href" {        attr.Val = "something"    }}但是因为attr不是指针,所以这行不通,我必须这样做:for i, attr := range n.Attr {    if attr.Key == "href" {        n.Attr[i].Val = "something"    }}有没有更简单或更快速的方法?是否可以直接从中获取指针range?显然,我不想仅仅为了迭代而更改结构,更冗长的解决方案不是解决方案。
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

例如:


package main


import "fmt"


type Attribute struct {

        Key, Val string

}


type Node struct {

        Attr []*Attribute

}


func main() {

        n := Node{[]*Attribute{

                &Attribute{"foo", ""},

                &Attribute{"href", ""},

                &Attribute{"bar", ""},

        }}


        for _, attr := range n.Attr {

                if attr.Key == "href" {

                        attr.Val = "something"

                }

        }


        for _, v := range n.Attr {

                fmt.Printf("%#v\n", *v)

        }

}

操场


输出量


main.Attribute{Key:"foo", Val:""}

main.Attribute{Key:"href", Val:"something"}

main.Attribute{Key:"bar", Val:""}

替代方法:


package main


import "fmt"


type Attribute struct {

        Key, Val string

}


type Node struct {

        Attr []Attribute

}


func main() {

        n := Node{[]Attribute{

            {"foo", ""},

            {"href", ""},

            {"bar", ""},

        }}


        for i := range n.Attr {

                attr := &n.Attr[i]

                if attr.Key == "href" {

                        attr.Val = "something"

                }

        }


        for _, v := range n.Attr {

                fmt.Printf("%#v\n", v)

        }

}

操场


输出:


main.Attribute{Key:"foo", Val:""}

main.Attribute{Key:"href", Val:"something"}

main.Attribute{Key:"bar", Val:""}


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 426 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信