我自己的Go语言学习笔记。
仓库地址
Go语言总体结构
每个Go语言项目应至少包含main.go
和go.mod
文件,前者是入口文件,后者是项目名称、所使用Go版本和需要引入的模块的列表。
main.go
应由最少两个结构:包名和main函数组成:
1 | package main |
可以使用import
关键字引入包:
1 | package main |
其中函数结构体的花括号不能单独一行,必须和func
等关键字处于同一行。
所有逻辑必须在函数内部。
变量、常量和赋值
变量
1 | // 由三部分组成:var 变量名 数据类型 |
如果变量从未被引用过则编译器可能会报错;
不能同时不写数据类型又不赋值。
也可以在函数中短定义变量,基本结构变量名:=值
:
1 | package main |
常量
1 | // 基本和变量的方法是一样的 |
运算符
算术运算
+
、-
、*
、/
。
1 | package main |
除四则运算还有一个取余数:
1 | package main |
输出结果是1
。
自增自减
++
:自增,步进值为1;--
:自减,步进值为1。
比较(关系运算)
>
/>=
:大于和大于等于;<
/<=
:小于和小于等于;!=
/==
:不等于和等于;
逻辑运算
下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。
&&
:逻辑 AND 运算符:如果两边的操作数都是 True,则条件 True,否则为 False,(A && B)
为 False;||
:逻辑 OR 运算符:如果两边的操作数有一个 True,则条件 True,否则为 False,(A || B)
为 True;!
:逻辑 NOT 运算符。如果条件为 True,则逻辑 NOT 条件 False,否则为 True,!(A && B)
为 True。
流程控制
If
基本结构:
1 | package main |
If 语句可以简写为:
1 | // if简写 |
即=true
部分可忽略。
For
1 | package main |
break跳出循环
执行到break
时立即停止。
1 | package main |
Switch
1 | switch 变量 { |
延迟执行
1 | package main |
数组
定义方法:
1 | // var 数组名 = [数量] 类型 {元素0,...,元素n-1} |
多维数组
1 | // 多维数组 |
获取多维数组元素数量
给定数组,求获取{7, 3, 6}
的元素数量。
1 | var arrTmp = [][]int{{1, 5}, {7, 3, 6}, {3, 5}} |
切片
切片的底层本质就是一种数组。
1 | // var 数组名 = [] 类型 {元素0,...,元素n-1} |
基于数组得到切片
数组或切片的截取操作。截取操作有带 2 个或者 3 个参数,形如:[i:j]
和 [i:j:k]
,假设截取对象的底层数组长度为 l。在操作符 [i:j]
中,如果 i 省略,默认 0,如果 j 省略,默认底层数组的长度,截取得到的切片长度和容量计算方法是 j-i
、l-i
。操作符 [i:j:k]
,k 主要是用来限制切片的容量,但是不能大于数组的长度 l,截取得到的切片长度和容量计算方法是 j-i
、k-i
。
1 | // 从数组获得切片 |
Make函数构造切片
1 | // make函数构造切片 |
元素数量是指里面会被初始化进去多少个元素,容量则是指底层数组的最大容量。容量值可省略,省略时容量=元素数量。
上例中输出值应为[0 0 0 0 0]
,因为初始化进去了五个元素,都是对应类型的默认值。
Map(映射)
声明Map并初始化
其中键值对数量可以省略。
1
2
3
4
5
6// var 映射名 = make(map[Key数据类型]值数据类型, 键值对数量)
var mapCity = make(map[string]string, 8)
fmt.Println(mapCity)
mapCity["Beijing"] = "001"
mapCity["Shanghai"] = "002"
fmt.Println(mapCity)取出键值
1
fmt.Println(mapCity["Shanghai"])
判断键值是否存在
1
2
3
4// val为若存在则取出的值,否则val为该类型的默认值
// ok是约定俗成的写法,代表该值是否存在,可以使用if ok {}这样的语句来判断
val, ok := mapCity["ShenYang"]
fmt.Println(ok, val)
Map 遍历
使用for...range...
结构来遍历map:
1 | // 第一个和第二个变量分别是关键字(Key)和值(Value) |
如果不需要接收其中一个值可以这么写:
1 | // 如果需要忽略的值在第二位可以不写 |
获取切片容量
1 | cap() |
Map 排序
待完成。
指针
Go语言中指针只有两种操作:取地址(&
)和根据地址取值(*
)。
1 | package main |
在上例中,a
的类型为int
,则b(指针)的类型为*int
。
指针传值
可以通过指针传值修改变量值。
1 | package main |