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 關注
- 280 瀏覽
添加回答
舉報
