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]
}
- 1 回答
- 0 关注
- 239 浏览
添加回答
举报