Go语言基础二 | 青训营笔记

56 阅读3分钟

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

前言

本文是参照:go.nsddd.top/ 进行go语言学习的学习笔记。

数组

关于数组,go与以前所学的c++有所不同。 首先在go中数组本身是属于值传递的,要是想修改数组的值,那么需要使用指针,如:

func test(arr *[3]int){
	(*arr)[0] = 88    //注意,此时先取值,然后再取地址
}
func main(){
    arr := [3]int{11,22,33}
    test(&arr)      //传递数组 ,, 此时需要使用取地址符
    fmt.Println("main arr = ",arr)
}

其次,在go中,长度也是数组类型的一部分,因此不能像c++一样在函数中采用默认参数,而要指定确定的值且保证值统一。

slice切片

事实上,切片是数组的一个引用,那么切片是一个引用类型,这和数组是不一样的,函数中改变的会改变其值。如果只需要复制对应的值,请采用copy()

创建切片的方式

方式一 定义一个切片,然后让切片去引用一个已经创建的数组。

var intArr [5]int = [...]int{11,22,33,44,55}  //数组
slice := intArr[1:3]

方式二 通过func make来创建一个切片

var slicename []type = make([],len,[cap])
//也可以简写为
slicename := make([]type, len)

数组内置函数

len()和cap()

len()为计算当前数组长度,而cap()则计算切片的总容量。

append()和copy()

如果需要扩充切片的容量,则需要用到append()。需要注意的是,使用append()时,Go顶层会创建一个新的数组newArr安装扩容后的大小,而这个newArr是在底层维护的,程序员不可见。

var slice []int = []int{100,200,300}
slice3 = append(slice,400,500)  
/*slice4则是一个新的空间,slice3被回收,如果是slice3,则在原来的空间扩容*/
fmt.Println("slice",slice)

map集合

简介

Map 是一种无序的键值对的集合。 Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。类似于python中的字典 ——key - value数据结构。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

定义map

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

map声明是不会分配内存的,初始化需要make,分配内存后才可赋值与使用

增删查改

增改

由于key是唯一的,所以可以直接修改和增加

key_1["a"] = "北京"  //增加
key_1["a"] = "上海"  //修改

使用delete函数

val,ok := key_1["a"]
if ok{
	fmt.Printf("有a的值为%v\n",val)
}else{
    fmt,Printf("没有a这个数")
}

delete(key_1,"a")     //删除

双重遍历

//使用for-range遍历一个结构比较复杂的map
studentMap :=make(map[string]map[string]string)
studentMap[ "stuo1"]= make(map[string]string3)
studentMap["stu01"]["name"] ="tom"
studentMap["stuo1"]["sex"] ="男"
studentMap["stue1"]["address"]=“北京长安街~”

studentMap[ "stuo2"] = make(map[string]string, 3)//这句话不能少!!
studentMap[ "stuo2"]["name"] = "mary"
studentMap[ "stuo2"]["sex"]=“女"
studentMap["stue2"]["address"] =“上海黄浦江~”
for k1, v1 := range studentMap {
    fmt.Println("k1=", k1)
    for k2, v2 := range v1{
        fmt.Printf("It k2=%v v2=%vln", k2,v2)
    }
    fmt.Println()
 }

测试结果: image.png

引用