这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
go语言基础(上)
note1 字符串
go语言里面字符串是内置类型,可以直接用+来拼接,也可以用==来判断是否两个字符串相等
note2 变量、常量的声明
变量可以显示声明,也可以自动推导得到,而在golang中,常量没有确定的类型,它会根据使用的上下文来自动确定类型
note3 if
if 后面的条件没有括号,并且必须要有大括号而且要接在if行
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
note4 循环
golang中没有while循环、没有do while循环,只有唯一的一种for循环,
死循环
for {
fmt.Println("loop")
break
}
c循环,同样可以使用continue和break
for j := 7; j < 9; j++ {
fmt.Println(j)
}
switch循环与其他语言不同,即使不写break,它也只会执行相匹配的分支,不会格外执行其他分支
例如,a=1的时候,只会执行case1
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
golang中的switch更加强大,变量可以使用任意类型,如字符串,结构体;甚至可以用来取代任意的if else语句
t := time.Now()
//fmt.Println(t)//2023-01-15 14:46:53.5392082 +0800 CST m=+0.002654701
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
note5 数组
数组是一个具有编号,且长度固定的元素序列。但在真实的项目中,很少用数组,更多使用的是切片,因为数组长度是固定的
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
note6 slice
数组是一个具有编号,且长度固定的元素序列。但在真实的业务代码里面我们很少直接用数组,因为它的长度是固定的,我们更多的时候用的是切片。
我们下面重点来看一下切片不同于数组:它是一个可变长度的数组,你可以任意时刻去更改长度,然后也有更多丰富的操作,我们可以用make来创建一个切片,创建的切片可以像数组那样去用,去往里面去写值或者去存储值。
切片可以用append去追加元素,这里注意一下append的用法,它必须把append的结果赋值给原数组。因为golang里面slice的原理实际上是存储了一个长度加一个容量,加一个指向数组的指针,在你之前和判断当中的时候,如果容量不够,那么会发生扩容并发的一个新的slice,所以你必须要赋值回去,在妹子来创建的时候也可以直接指定长度,这样就相当于你刚创建完就有对应的长度,你可以用copy在两个slice里面去拷贝数组,莱斯还拥有像Python一样的切片操作,比如这里的话代表我去取出来第二个位置到第五个位置的元素不包括第五个元素,所以输出的是cde。不同,Python这里不支持负数索引,所以你需要len用来取出slice的长度,然后再做一些简单的运算。
note7 map
介绍一下,在其他编程语言里面,它可能叫做哈希或者字典。
map是实际使用过程中使用最频繁的数据结构,我们可以用make去创建一个空map,这里会需要两个类型,第一个类型是key的类型,这里是string,第二个类型是value的类型,这里是int。
创建完完map之后,我们可以往里面通过[ ]语法去写入k-v对,然后也能通过[ ]去读取k-v对,然后我们通过delete去删除k-v对,在从map里面是读取kv对的时候,我们可以在后面接加一个ok,用来获取这个map里面到底有没有这个k存在。
在golang里面的map它是完全无序的,建立的时候不会按字母顺序,也不会按插入顺序输出,而是一个偏随机的顺序。
note8 range
对一个slice或者map,我们可以用range来快速遍历,这样代码能够更加简洁,range遍历的时候,对于数组会返回两个值,第一个值是索引,第二个值是对应位置的值,如果我们不需要索引的话,我们可以用下划线去忽略,假如遍历map的话,那么第一个值是key,第二个值是value,我们来看一下国道里面的函数
note9 函数
下面我们来看一下里面的函数,先看第五行到第七行代码,这是golang里面一个最简单的实现两个变量相加的函数,golang里面和进了很多语言不一样的是变量类型是后置的,golang里面的函数是原生支持返回多个值,但实际的业务逻辑代码里面几乎所有的函数都返回多个值,第一个值是真正的返回结果,第二个值是错误信息,参考第13到第16行代码这里的话,这个函数会返回两个值,一个值是真正的value,第二个是返回ok,就是是否存在。
note10 指针
golang也出过指针,当然相比c或者c++里面的指针,这里支持的操作非常有限,指针的一个主要用途就是对传入的参数进行修改,我们先看第五行到第七行这一个函数,这个函数它试图把一个变量加二,但是实际上上面这种写法是无效的,因为传入的参数实际上是个拷贝,这个+2是对一个拷贝进行的+2,并不起作用,如果我们需要起作用的话,我们需要把这个n写成一个指针类型,然后为了类型匹配调用的时候,会需要加一个&符号才能编译通过,同样这边运算的时候会加需要加一个*号。这样子我们就成功实现了对一个变量自增2的一个函数。