Go基础语法part2| 青训营笔记

48 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

基础语法

switch结构

下面是关于switch分支结构,go语言里面的switch分支结构。看起来也C或者C++比较类以。同样的在switch后面的那个变量名,并不是要括号。这里有个很大的一点不同的是,在c++里面,switch case如果不不显示加break的话会然后会继续往下跑完所有的case,在go语言里面的话是不需要加break的。相比C或者C++,go语言里面的switch功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的if else语句。可以在switch后面不加任何的变量,然后在case里面写条件分支。这样代码相比用多个if else代码逻辑会更为清晰。

GO语言中的switch语句,可以非常容易的判断多个值的情况

语法:

switch var1{
    case 条件1case 条件2default :
}
​

数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩的动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。

数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。内置的len函数将返回数组中元素的个数。

var a [3]int             // array of 3 integers
fmt.Println(a[0])        // print the first element
fmt.Println(a[len(a)-1]) // print the last element, a[2]// Print the indices and elements.
for i, v := range a {
    fmt.Printf("%d %d\n", i, v)
}
​
// Print the elements only.
for _, v := range a {
    fmt.Printf("%d\n", v)
}

默认情况下,数组的每个元素都被初始化为元素类型对应的零值,对于数字类型来说就是0。我们也可以使用数组字面值语法用一组值来初始化数组:

var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"

在数组字面值中,如果在数组的长度位置出现的是“...”省略号,则表示数组的长度是根据初始化值的个数来计算。因此,上面q数组的定义可以简化为

q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"

数组的长度是数组类型的一个组成部分,因此[3]int和[4]int是两种不同的数组类型。数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定。

q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // compile error: cannot assign [4]int to [3]int

切片

Go 语言切片是对数组的一种抽象。

Go 数组的长度不可改变,在特定场景中就不太适用,Go 中提供了一种灵活,功能强悍的内置类型:切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

需要说明,slice 并不是数组或数组指针。它通过内部指针和相关属性 引用数组片段 ,以实现变长方案。

  1. 切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。
  2. 切片的长度可以改变,因此,切片相当于一个可变的数组。
  3. 切片遍历方式和数组一样,可以用 len() 求长度。表示可用元素数量,读写操作不能超过该限制。
  4. cap 可以求出 slice 最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。
  5. 切片的定义:var 切片变量名 []类型,比如 var str []stringvar arr []int
  6. 如果 slice == nil,那么 len、cap 结果都等于 0。

切片 Slice 在源码中的数据结构定义如下:

type slice struct {
    array unsafe.Pointer  //一个指向数组的指针
    len   int
    cap   int
}
12345

切片的结构体由3部分构成,Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len 的。

总结: Go 语言中的切片类型是从数组类型基础上发展出来的新类型,当声明一个数组时,不指定该数组长度,则该类型为切片(“动态数组”),切片有自己独立的内部结构字段(len, cap, array pointer),并于其引用的底层数组共用存储空间。

声明切片
方法1

可以 声明 一个 未指定大小的数组 来定义切片,切片声明时不需要说明长度( []没有声明长度,说明这是一个切片,而不是一个数组。因为数组声明是必须指定长度的。 ):

var identifier []type
1

如上这种形式的只声明不初始化,这时切片 默认 初始化为 nillen=0 cap=0 slice=[]

之所以为 nil ,是因为 没有分配存储空间

方法2

如果想声明一个拥有初始长度或规定容量的切片(可以指定切片的长度和容量),可以使用 make() 函数来创建切片:

var slice1 []type = make([]type, length, capacity)
​
也可以简写为
​
slice1 := make([]type, length, capacity)
12345

这里 length 是数组的长度并且也是切片的初始长度。 容量 capacity 为可选参数(可选的意思是可以缺省,如果不指定capacity,则capacity默认等于length)。