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

如何在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 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

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