目的:我有一个很大的缓冲区,并且我想有一个指向缓冲区中不同位置的指针数组/切片。
我在做什么:
datPtrs := make([][]byte, n)
for i:=0; i<n; i++{
datPtrs[i] = bigBuf[i*m:(i+1)*m]
}
我的问题:
答案 0 :(得分:3)
Go slice被实现为一个结构:
src/runtime/slice.go
:
type slice struct {
array unsafe.Pointer
len int
cap int
}
您正在分配/复制切片结构,该切片结构不复制基础数组,而仅复制其指针。
一个简单的例子:
package main
import (
"fmt"
)
func main() {
buf := make([]byte, 8)
for i := range buf {
buf[i] = byte(i)
}
sub := buf[1:3]
fmt.Println(buf)
fmt.Println(sub)
for i := range sub {
sub[i] += 43
}
fmt.Println(buf)
fmt.Println(sub)
}
游乐场:https://play.golang.org/p/4OzPwuNmUlY
输出:
[0 1 2 3 4 5 6 7]
[1 2]
[0 44 45 3 4 5 6 7]
[44 45]
答案 1 :(得分:2)
切片只是指向内存+ len
和cap
的指针
参见:Why can not I duplicate a slice with `copy()` in Golang?
package main
import (
"fmt"
)
func main() {
bigBuf := []byte{1, 2, 3, 4, 5}
datPtrs := make([][]byte, 2)
for i := 0; i < 2; i++ {
datPtrs[i] = bigBuf[i : i+1]
}
fmt.Println(bigBuf) // [1 2 3 4 5]
datPtrs[0][0] = 10
fmt.Println(bigBuf) // [10 2 3 4 5]
datPtrs[1][0] = 20
fmt.Println(bigBuf) // [10 20 3 4 5]
}