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

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

如何在golang中更改指針切片

如何在golang中更改指針切片

Go
慕沐林林 2021-09-27 15:31:30
我試圖更好地理解 go。我為自己創建了一個小練習:將指針切片傳遞給函數并修改它。這就是我想出的:package mainimport (    "fmt"    "unsafe")func main() {    var data *[]byte    fillData(data)    fmt.Println((*data)[0:5])}func fillData(data *[]byte) {    b := []byte("hello")    fmt.Println(b[0:5])    fmt.Println(string(b[0:5]))    data = (*[]byte)(unsafe.Pointer(&b[0]))}但它給出了一個invalid memory address or nil pointer dereference錯誤。我知道我不會在實際代碼中使用這樣的東西,但我只是好奇如何傳遞切片并修改它而不返回它。https://play.golang.org/p/_K5ltKKKNV
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

當您嘗試在 中更新data時fillData,您會犯兩個錯誤。首先,您更新指針而不是它所指向的內容。其次,data是一個 nil 指針,因此通過該指針寫入將導致 nil 指針錯誤。


這是編寫代碼的一種可能方法。data以歸零切片開始,并在fillData. 這會將切片信息(len、cap 和指向數組的指針)復制b到*data這意味著data將與其共享信息b(重要的是,包括共享底層數組)。


package main


import "fmt"


func main() {

    var data []byte

    fillData(&data)

    fmt.Println(data, data[0:5])

}


func fillData(data *[]byte) {

    b := []byte("hello")

    *data = b[0:1]

}

另一種方法是data成為一個指針,并更新它。然后你必須將一個雙指針傳遞給fillData. 那看起來像這樣:


package main


import "fmt"


func main() {

    var data *[]byte

    fillData(&data)

    fmt.Println((*data)[0:5])

}


func fillData(data **[]byte) {

    b := []byte("hello")

    *data = &b

}

最后,編寫此代碼的最佳方法是根本不使用指針,而只返回切片。與 C 或 C++ 不同,很少需要對函數使用“輸出”參數。那是因為 go 允許多個返回值。


package main


import "fmt"


func main() {

    data := getData()

    fmt.Println(data, data[0:5])

}


func getData() []byte {

    return []byte("hello")[:1]

}


查看完整回答
反對 回復 2021-09-27
  • 1 回答
  • 0 關注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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