Go学习笔记——同构复合类型
一、数组的特性
定义:Go 语言的数组是一个长度固定的、由同构类型元素组成的连续序列
要点1:var arr[N]T,T为数组类型,N为长度,其中N只能是整型或者常量表达式。
实际使用时,[N]可由[...]代替,go编译器在编译时会自动识别数组长度
unsafe包提供的Sizeof函数可以获得数组变量的大小,测试学习时,很有用
代码案例
package main
import (
"fmt"
"unsafe"
)
var arr = [...]float64{1, 2}
var arr2 = [...]int{
99: 39,
}
func main() {
fmt.Println("数组")
fmt.Println(len(arr))//2
fmt.Println(unsafe.Sizeof(arr2))//800
fmt.Printf("%T\n", arr2)//[100]int
}
二、多维数组
定义:数组类型自身也可以作为数组元素的类型,这样就会产生多维数组

要点:数组类型是 Go 语言中最基础的复合数据类型。数组类型变量是一个整体,这就意味着一个数组变量表示的是整个数组。无论是参与迭代,还是作为实际参数传给一个函数 / 方法,Go 传递数组的方式都是纯粹的值拷贝,会带来较大的内存拷贝开销。为了避免这个问题,Go提供了一种灵活的方式来解决——切片。这也是Go语言中最常用的同构复合类型
三、切片(slice)
初识:切片和数组很像,在变量的生命上,切片只是少了一个“长度”属性
var arr = [2]int{1, 2} //声明数组
var sli = []int{1,2} //声明切片
异同点
切片也可以通过len函数来获取长度,不同的是,切片支持动态添加元素,使用内置函数append可实现动态变化
package main
import (
"fmt"
"unsafe"
)
var sli = []int{1, 2, 3}
func main() {
fmt.Println("切片")
fmt.Println(len(sli)) //3
sli = append(sli, 4, 5)
fmt.Println(len(sli)) //5
}
四、切片的实现原理
好了,今天就到这里,最近项目有些紧,笔记记得也不太好,关于原理性的阐述,我暂时就没有深入思考,等后续有时间再来完善。