增加 Golang 切片地址.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2021-10-23 20:38:33 +08:00
parent 1c31f50aee
commit 346d4f0347
1 changed files with 36 additions and 0 deletions

View File

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