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

使用指针修改切片元素

使用指针修改切片元素

Go
慕森卡 2022-09-19 14:47:27
我目前正在尝试通过将指针传递给函数来修改切片的元素。在函数外部,元素不会被修改。有没有办法在不传递切片本身以及要更改的所需元素的索引的情况下修改元素?package mainimport (    "fmt")type Item struct {    Value int}func alter(t *Item) {    (*t).Value = 100}func main() {    items := []Item{Item{0}, Item{1}}    for _, item := range items {        alter(&item)    }    fmt.Println(items) // Output is still [{0} {1}]}高浪游乐场
查看完整描述

2 回答

?
HUX布斯

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

for i := range items {

    alter(&items[i])

}


items := []*Item{{0}, {1}}


for _, item := range items {

    alter(item)

}

您的版本不起作用的原因是,迭代变量在切片中保存元素的副本,这意味着您正在修改的是副本而不是原始副本。如果您运行以下命令,您可以看到它们是内存中的独立对象:https://play.golang.org/p/vr9CfX0WQcBitem


查看完整回答
反对 回复 2022-09-19
?
翻阅古今

TA贡献1780条经验 获得超5个赞

参考:https://tour.golang.org/moretypes/16


for 循环的范围形式在切片或映射上迭代。


在切片上划过范围时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处元素的副本。


所以


for i, x := range arr {

    // x is copy for arr[i]

}

因此,我们将直接使用相同的地址并将其传递给函数,以便可以对其进行修改。arr[i]alter


示例代码:


package main


import "fmt"


type Item struct {

    Value int

}


func alter(t *Item) {

    (*t).Value = 100

}


func main() {

    items := []Item{{0}, {1}}


    for i := range items {

        alter(&items[i])

    }


    fmt.Println(items)

}


查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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