When you try to update data
in fillData
, you make two errors. First, you update the pointer rather than what it's pointed to. Second, data
is a nil pointer, so writing through that pointer will cause a nil pointer error.
Here's one possible way to write the code. data
starts as a zero'ed slice, and gets updated inside fillData
. This will copy the slice information (len, cap, and pointer to array) from b
to *data
which means that data
will share information with b
(importantly, including sharing the underlying array).
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]
}
Another way would be to have data
being a pointer, and updating it. Then you have to pass a double pointer into fillData
. That would look like this:
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
}
Finally, the best way to write this code isn't to use pointers at all, and just return the slice. Unlike C or C++, it's rarely needed to use "output" parameters to functions. That's because go allows multiple return values.
package main
import "fmt"
func main() {
data := getData()
fmt.Println(data, data[0:5])
}
func getData() []byte {
return []byte("hello")[:1]
}