Go语言基础语法 | 青训营笔记

217 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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()

参考资料

[Go语言圣经(中文版)]