持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,
本文是6.20的GO学习记录 主要内容为关于切片 map 结构体 函数 指针的基础语法
切片
数组和切片的区别:
数组的长度固定不能修改 [ ]里是一个定值
切片的长度和容量可以不固定 [ ]里为空或者…
切片对数组的引用
例如数组 array :=[...]int[10,20,30,40,50]
切片slice :=array[0:3:5]
切片引用了array,起点是array[0],终点是array3 最大范围对应值为array[5] 长度为3-0 容量为5-0
切片的创建
1. 自动推导类型 同时初始化 这种创建 长度和容量一致
s1 :=[ ]int {1,2,3,4}
fmt.Println(“s1 “,s1)
2. 借助make函数 格式:s :=make([ ]切片类型,切片长度,切片容量)
S2 :=make([ ]int, 3,5)
注意:若没有指定容量,则容量和长度一致 s :=make([ ]切片类型,切片长度)
切片截取
注意:Println自带换行功能
切片和底层数组的关系:对切片的1操作会影响底层数组 在切片中改变值,底层数组中对应位置的值会相应改变
append函数
作用:每使用一次,在原切片的末尾新增一个元素 并返回操作后的切片 可扩大切片的长度和容量
使用格式:s=append(s,1)//在切片s末尾新增元素1
1)未超过容量
结果如下:长度扩充了 由于未超过容量 故容量不扩充
2)超过切片容量
结果如下:超过容量将双倍扩充容量(当然长度也扩充了)
注意:GO对于大括号的格式也有要求 前半个大括号必须和条件在同一行 而不能另起一行 否则会报错
copy函数
作用:把一个切片的内容对应复制更新到另一个切片中 最终会返回目的切片
操作格式:copy(b,a)//b:目的切片 a:源切片
切片做函数参数:不会像数组一样 他只是一个引用传递
map( 映射,字典)
一种内置的数据结构 无序的key-value对应集合 如身份证用于唯一表示一个人
map的格式 map[keyType]valueType
注意:
1.所有的键值都是唯一的
2.keyType必须支持==和!= 故不支持函数,切片等作为map的键类型
3.keyType 和valueType可以不同,但键和值的类型要分别相同
4.map是无序的,故每次打印的顺序可能不同 但一一对应的一组映射是相同的
1) map的创建
在创建过程中,若随着赋值长度超过了预先设定值会自动扩充 就如append
1.1创建方法
a.通过创建变量
b.通过make函数创建
打印结果为:
map 赋值
先创建一个map 然后逐个赋值:
map 遍历并判断某个key值是否存在
详说一下如何判断:
value,ok :=m[2]//2为想要判断的key值 value为关键字对应的值,ok为想要判断的key值是否存在的条件 若存在则为true,不存在即为false 如果为true对应的m[ ]中的数字为想要判断的key值
从map中删除某个key
m:=map[int]string{1:”mike”,2:”yoyo”,3:”lala”}
delete(m,1)//把关键字1删除
map 做函数参数(引用传递)
func test(m map[int]string){
delete(m,1)
}
//被调用的函数要定义在调用函数的前面
func main(){
m:=map[int]string{1:”mike”,2:”yoyo”,3:”lala”}
test(m)
}
range 语言范围 (客队数组和slice快速遍历)
对于数组,返回的是索引index(下标)和数组对应位置的值
若不需要索引 可在for循环那儿用下划线代替i
将输出 0 2 \n(换行 写不下了) 9
对于map(上面有提及)
先创建并初始化一个map
函数:
需要注意的是go语言中,变量类型要后置
返回值通常有多个:真正的返回值,是否存在(0/1)
有些功能不需要返回值 故返回值不是必须的
函数定义格式:
func 函数名(参数列表)(返回值列表) {
函数体
}
例如:func swap(x, y string) (string,string){
return y,x
}
指针
取址符为&
地址用16进制数表示 输出为%x
var ip *int
ip=&a
指针变量通常缩写为ptr 空指针:ptr==nil