987 B
987 B
Golang 切片地址
var sa []byte
如上的一个 byte 切片,虽然其声明形式与数组类似,但是其实质与数组相差很大。
数组本身就是一段连续的内存地址,因此分配数组时需要给定一个常量作为数组的长度。而切片长度并不固定,还可以动态改变长度,因此切片是一个数据结构,它包含两个部分,即切片信息的描述部分和数据部分。
因此,对切片取地址,就产生了两种方式:
- 对切片本身取地址,得到切片描述信息部分的地址;
- 对切片数据取地址,得到切片数据地址。
sa := make([]byte, 4)
// 切片本身的地址
psa1 := &sa
// 切片数据的地址
psa2 := &sa[0]
psa3 := &sa[2]
以上 psa1 的值不等于 psa2 的值。
如果想将切片数据赋值到谋连续内存空间中,可采用如下方式:
sa := []byte{0x11, 0x22, 0x33, 0x44}
var aa [4]byte
copy(aa[:], sa)
fmt.Println(aa)