GO入门(三) | 青训营笔记

63 阅读2分钟

续前

GO入门(二)

数组

声明及初始化

数组定义格式为:var 变量名 [数组长度]变量类型

var arr [5]int    //声明arr为长度为5的整型数组
var arr1 [5]int = [5]int{1,2,3,4,5}  //初始化arr1为长度为5的整型数组
var arr2 = [5]int{1,2,3,4,5}    //同上
var arr2 = [...]int{1,2,3,4,5}  //同上
var str = [5]string{2:"xiaoming",4:"grow"}  //使用索引号初始化字符串数组的元素
//以上方法也均可以使用:=运算符实现局部初始化
les:=[...]struct{   //在代码块中声明并初始化匿名结构体数组
    name string
    age int
}{
    {"name1",18},
    {"name2",24},
}

遍历数组

数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1

for i := 0; i < len(a); i++ {
}
for index, v := range a {
}

切片

切片(slice)是数组的一个引用。因此切片是引用类型,本质是一个结构体,做赋值操作时进行浅拷贝。

type slice struct{
    array unsafe.Pointer    //数组的指针
    len int       //数组长度
    cap int       //切片容量
}

创建切片

切片定义格式为:var 变量名 []变量类型

var s1 []int    //普通声明
s2:=[]int{}     //局部声明
var s3 []int=make([]int,3,5)   //使用make()函数声明

操作切片

var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice0 []int = arr[start:end] 
var slice1 []int = arr[:end]        
var slice2 []int = arr[start:]        
var slice3 []int = arr[:] 
var slice4 = arr[:len(arr)-1]      //去掉切片的最后一个元素
slice5 := arr[start:end]
slice6 := arr[:end]        
slice7 := arr[start:]     
slice8 := arr[:]  
slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素
slice10:= append(slice0,10) //使用内置append()函数操作切片

追加切片时如果切片数量超出cap的值,则会扩容。首先复制一份数组元素到其它地址,并提供2倍的cap空间,此时array指针和之前不同,cap为之前的二倍,之后再进行切片操作。

映射

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。map的定义格式为:map[KeyType]ValueType

map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:

    make(map[KeyType]ValueType, [cap])

其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

map操作

scoreMap := make(map[string]int, 8)  //使用make()函数初始化
scoreMap["小明"]=90       //通过键值赋值

if val,exists:=scoreMap[“小明”];exists{   //索引的第一个返回值为映射值,第二个返回值为是否存在
    fmt.Print(val)
}else{
    fmt.Print("小明不存在"]
}

delete(scoreMap,"小明"] //使用delete()函数删除键值对


for k,v := range scoreMap{  //使用range遍历map,返回值为键和值
    fmt.Println(k, v)
}