这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
今天正式结束了青训营的后端大项目开发,青训营工作人员也是上传了相应的青训营复习文档。作为一名转码选手,在写完大项目后我发现自己还是对 Go 语言的基础语法掌握不足,所以又重头复习了一遍 Go 的基础语法
Go 语言的优点
- 语法简单:没有继承、多态等复杂概念
- 静态编译:编译完成后可以直接在服务器上运行
- 自动回收:无需用户自己处理 gc
- 高效并发:go 官方在语法层面上支持并发
init 函数与 main 函数
init 函数:仅仅在包的初始化时执行的函数,其主要特征有:
- init 函数不可以被其他函数调用
- init 函数在 main 函数开始之前执行完毕
- init 函数执行的先后顺序由各个包的依赖关系决定
- 一个包内可以有多个 init 函数
main 函数:go 语言的默认入口函数
运算符
go 语言中没有三元运算符
算数运算符
- 相减
* 相乘
/ 相除
% 取余
逻辑运算符
|| 或
! 非
关系运算符
!= 不等
> 大于
< 小于
>= 大于等于
< 小于
<= 小于等于
位运算符
| 位或
^ 位异或
<< 左移
>> 右移
幅值运算符
go 语言还支持 +=
-=
等赋值运算符
下划线
- -下划线用于忽略运算结果
- 如果在导包时在包名前加上了 - 表示只执行包内的 init 函数
数组 Array
- 是一种定长序列,数组长度必须为常量
- 可以通过下标访问元素,数组下标从0开始计数
- 数组访问不能用越界 0 ~ len-1
- 对数组进行赋值穿三时会复制整个数组,而非只传递数组首地址指针
- 支持 == != 等操作符
- 声明
var a [len]int
切片
- 切片是引用类型
- 切片长度可变,类似于vector
- 切片可以通过下标访问元素
- 切片可以为 nil
- 声明
var arr []int
指针
Go 语言的指针与 C++ 类似,但是不支持便宜和运算,是安全指针
Map
Go 中的 map 是一种无序 key-value 结构,如果想要排序的 map,往往需要搭配 sort slice 实现 map 的声明
scoreMap := make(map[string]int, 8)
结构体
定义方式
type name struct {
字段名 字段类型
字段名 字段类型
…
}
流程控制
if-else
Go 中 if else 结构忽略了括号,但是所有的结构体以及后续 else if 与 else 必须紧跟
if n := "abc"; x > 0 {
println(n[2])
} else if x < 0 { //必须紧跟
println(n[1])
} else {
println(n[0])
}
switch-case
go 中的每个 case 执行后不会再执行其他 case 所以不需要我们手动 break
switch var1 {
case val1:
...
case val2:
...
default:
...
}
select
select 会速记执行一个可运行 case, 在通信,阻塞中使用较多
for循环
// 类比 for(i = 0; i < n; i++) {}
for a := 0; a < 10; a++ {
fmt.Printf("a 的值为: %d\n", a)
}
// 类比 while()
for a < b {
a++
fmt.Printf("a 的值为: %d\n", a)
}
// 类比 for(num := nums) {}
for i,x:= range numbers {
fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
}
range
for key, value := range oldMap {
newMap[key] = value
}