Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在golang中更改指针切片_Go - Fatal编程技术网

如何在golang中更改指针切片

如何在golang中更改指针切片,go,Go,我正试图更好地理解围棋。我为自己做了一个小练习:将指针片传递给函数并修改它 这就是我想到的: package main import ( "fmt" "unsafe" ) func main() { var data *[]byte fillData(data) fmt.Println((*data)[0:5]) } func fillData(data *[]byte) { b := []byte("hello") fmt.Prin

我正试图更好地理解围棋。我为自己做了一个小练习:将指针片传递给函数并修改它

这就是我想到的:

package main

import (
    "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]))
}
但它给出了一个
无效内存地址或零指针解引用错误。我知道我不会在真正的代码中使用这样的东西,但我只是好奇如何传递一个片段并修改它而不返回它


fillData
中尝试更新
数据时,会出现两个错误。首先,更新指针,而不是它指向的对象。其次,
data
是一个nil指针,因此通过该指针写入将导致nil指针错误

这里有一种可能的编写代码的方法<代码>数据
以零位片开始,并在
填充数据
中更新。这将把切片信息(len、cap和指向数组的指针)从
b
复制到
*data
,这意味着
data
将与
b
共享信息(重要的是,包括共享底层数组)

另一种方法是将
数据
作为指针,并对其进行更新。然后必须将双指针传递到
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]
}

fillData
中尝试更新
数据时,会出现两个错误。首先,更新指针,而不是它指向的对象。其次,
data
是一个nil指针,因此通过该指针写入将导致nil指针错误

这里有一种可能的编写代码的方法<代码>数据
以零位片开始,并在
填充数据
中更新。这将把切片信息(len、cap和指向数组的指针)从
b
复制到
*data
,这意味着
data
将与
b
共享信息(重要的是,包括共享底层数组)

另一种方法是将
数据
作为指针,并对其进行更新。然后必须将双指针传递到
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]
}

fillData
中尝试更新
数据时,会出现两个错误。首先,更新指针,而不是它指向的对象。其次,
data
是一个nil指针,因此通过该指针写入将导致nil指针错误

这里有一种可能的编写代码的方法<代码>数据
以零位片开始,并在
填充数据
中更新。这将把切片信息(len、cap和指向数组的指针)从
b
复制到
*data
,这意味着
data
将与
b
共享信息(重要的是,包括共享底层数组)

另一种方法是将
数据
作为指针,并对其进行更新。然后必须将双指针传递到
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]
}

fillData
中尝试更新
数据时,会出现两个错误。首先,更新指针,而不是它指向的对象。其次,
data
是一个nil指针,因此通过该指针写入将导致nil指针错误

这里有一种可能的编写代码的方法<代码>数据
以零位片开始,并在
填充数据
中更新。这将把切片信息(len、cap和指向数组的指针)从
b
复制到
*data
,这意味着
data
将与
b
共享信息(重要的是,包括共享底层数组)

另一种方法是将
数据
作为指针,并对其进行更新。然后必须将双指针传递到
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]
}

不使用
不安全的
可能重复。您可以通过使用
*
取消对指针的引用来更改指针指向的对象(而不是它指向的位置)<代码>*数据=b
。当然,您很少需要将指针传递到切片,通常最好返回一个切片(可能已修改),ala
append
。您也没有分配
数据
变量,因此您试图修改由nil指针指向的内容。就这样。我错过了新的()调用。我去读一下。谢谢你的帮助,戴夫!如果您将其作为答案发布,我将接受。可能重复的请勿使用
不安全的
。您可以通过使用
*
取消对指针的引用来更改指针指向的对象(而不是它指向的位置)<代码>*数据=b
。当然,您很少需要将指针传递到切片,通常最好返回一个切片(可能已修改),ala
append
。您也没有分配
数据
变量,因此您试图修改由nil指针指向的内容。就这样。我错过了新的()调用。我去读一下。谢谢你的帮助,戴夫!如果你把它作为答案贴出来,我会接受的。可能是重复的