37 lines
987 B
Markdown
37 lines
987 B
Markdown
|
# 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)
|
||
|
```
|