这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
注:本人之前所学语言为C++,对python也有所了解,所以这里只记录一些Go与它们的不同之处
1 基础语法
1.1 变量
var 变量名 类型 = 表达式
“类型”或“= 表达式”可以省略其中之一。若省略了“类型”,则根据初始表达式来推导变量类型信息。若省略了“= 表达式”,则使用零值初始化该变量。数值类型为0,布尔类型为false,字符串类型为空字符串,接口或引用类型(包括slice、指针、map、chan和函数)为nil,数组或结构体等聚合类型为每个元素或字段都是对应该类型的零值。
1.2 简短变量
名字 := 表达式
该形式可用于声明和初始化局部变量,变量的类型将根据表达式自动推导。若简短变量声明左边的变量已经被声明过,则简短变量声明语句对这些已经声明过的变量会改为赋值行为(同级作用域下)。此外,简短声明语句中至少要存在一个新的变量,否则将会编译出错。
1.3 类型
type 类型名字 底层类型
如:
type Celsius float64 // 摄氏温度
type Fahrenheit float64 // 华氏温度
类型声明语句创建了一个新的类型名称,和现有类型具有相同的底层结构。新命名的类型提供了一个方法,用来分隔不同概念的类型,这样即使它们底层类型相同也是不兼容的。
1.4 if else
- if后面没有括号
- 后面需接大括号
1.5 循环
Go语言中只有for循环语句,for循环有多种形式。
// initialization可选,若存在,必须是一条简单语句,
// 即简短变量声明,自增语句、赋值语句或函数调用。
for initialization; condition; post {
}
// 三个部分都可省略
// 如果只有condition,则分号也可以省略
for condition {
// 类比while循环
}
// 全部省略
for {
// 无限循环,可通过break,return终止
}
1.6 switch
- switch后的变量名没有括号
- 不需要显示地在每一个case后写break
- 如果想达到穿透效果,可以显示地写出fallthrough
- switch后可以使用任意类型的变量类型
- switch后可以不加任何变量(无tag switch,等同于switch true),每个case的表达式和true进行比较
1.7 数组
由于长度固定,所以在Go语言中使用较少,更多的是使用slice(切片)。
var a [3]int // 三个整数组成的数组,元素被初始化为零值
var q [3]int = [3]int{1, 2, 3} // 字面值语法初始化
q := [...]int{1, 2, 3} // 数组长度根据初始化值的个数推导
// 数组长度为数组类型的一部分
// [3]int 和[4]int是两种不同的数组类型
// 数组的长度必须是常量表达式,因为需要在编译阶段确定
// 数组、slice、map和结构体字面值的写法相似
// 除上述直接提供顺序初始化值序列之外
// 还可以指定索引和对应值列表的方式初始化
// 定义了一个含有100个元素的数组r
r := [...]int{99:-1} // 最后一个被初始化为-1,其余为0
// 当数组的元素类型是可以相互比较的
// 那么数组可也以相互比较(需要数组类型相同)
1.8 切片(slice)
具有相同元素类型的变长序列,一个slice类型一般写作[]T,T为元素类型。slice的底层引用了一个数组对象,slice包含三部分:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址。
创建切片:
make([]T, len)
make([]T, len, cap) 等同于 make([]T, cap)[:len]
append()函数用来向slice追加元素,当容量不够时,会扩容并返回新的slice。
1.9 map
map类型可以写为map[K]V,其中K和V分别对应key和value的元素类型。
创建map:
// make函数
args := make(map[string]int)
// 字面值初始化
args := map[string]int{
"a": 1,
"b": 2,
}
删除元素:
delete(args, "a)
- map的遍历顺序是随机的
- map类型的零值是nil
1.10 range
通常用于循环遍历,每次迭代都产生一对值,索引以及该索引处的元素值,若不需要索引,可用下划线忽略。
1.11 函数
函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
func name(parameters-list) (return-list) {
body
}
返回值也可以像形式参数一样被命名。在这种情况下,每个返回值被声明成一个局部变量,并根据该返回值的类型,将其初始化为零值。
func add(x, y int) (z int) {z = x - y; return}
Go语言中一个函数可以返回多个值,实际的业务逻辑代码里的函数几乎都返回两个值,第一个值是返回结果,第二个值是错误信息。
1.12 方法
与类的成员函数相似。
func (p T) name(parameters-list) (return-list) {
body
}
// 调用
a := T{初始值}
a.name()