亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用指針修改切片元素

使用指針修改切片元素

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 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號