Bootstrap

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
}

四、切片的实现原理

不记了,传送门:

好了,今天就到这里,最近项目有些紧,笔记记得也不太好,关于原理性的阐述,我暂时就没有深入思考,等后续有时间再来完善。