diff --git a/Software/Development/Language/Go/Basic/Slice/Golang_切片地址.md b/Software/Development/Language/Go/Basic/Slice/Golang_切片地址.md new file mode 100644 index 0000000..5128335 --- /dev/null +++ b/Software/Development/Language/Go/Basic/Slice/Golang_切片地址.md @@ -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) +```