中文官网地址:Go语言中文网
官方文档地址:Go中文文档 (要学会查官方文档 ~ )
1. 基础语法
1.5 if-else
写法和其他编程语言很类似,但是条件判断没有括号,如果不在条件判断语句后面换行而是将大括号放在同一行,那么大括号前后需要有一个空格:
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
另外,在Go语言中,允许在条件判断之前执行一个short statement,例如:
if num := 9; num < 0 {
fmt.Println(num, "is negative")
}
其中,num := 9 在if语句的作用域内声明了一个变量 num 并赋值为 9 。然后,条件判断部分 num < 0 决定是否执行接下来的代码块,如果 num 小于0,则输出语句说明 num 是一个负数。
1.6 循环
在Go语言中没有 while 和 do-while 循环,只有 for 循环:
- 基本用法
与C或者C++中的用法类似:
for i := 0; i < 5; i++ {
fmt.Println(i)
}
- 类似于while的用法
直接把条件判断语句接在 for 后面:
sum := 0
for sum < 10 {
sum += 2
fmt.Println(sum)
}
- 无限循环
通过在循环体内使用 break 终止:
for {
...
}
1.7 switch
- 基本用法
与C或者C++中的用法类似,根据表达式的值来匹配不同的 case 分支,如:
num := 2
switch num {
case 1:
fmt.Println("One")
case 2:
fmt.Println("Two")
default:
fmt.Println("Unknown")
}
- 多值 case 分支
可以在一个 case 分支中匹配多个值,如:
char := 'a'
switch char {
case 'a', 'A':
fmt.Println("Letter A")
case 'b', 'B':
fmt.Println("Letter B")
...
}
上述语句中,条件判断是 char == 'a' 或 char == 'A' 时,会执行第一个 case 分支中的代码,输出 "Letter A"。在一个分支中匹配多个可能的条件,能使得代码更加简洁。
- 不带表达式的 switch 语句
Go语言中,switch 后表达式不是必须的,可以在 case 分支中提供条件判断,如:
hour := time.Now().Hour()
switch {
case hour < 12:
fmt.Println("morning ~")
case hour < 18:
fmt.Println("afternoon ~")
...
}
- fallthrough
在Go语言中, switch 语句默认在匹配到某个 case 分支后终止,不会再继续执行其他分支的代码,效果就像C或C++中使用 break 语句来中断 switch 语句一样。
使用 fallthrough 关键字可以使程序在匹配到某个 case 分支后继续执行下一个 case 分支的代码,例如:
num := 2
switch num {
case 1:
fmt.Println("One")
fallthrough
case 2:
fmt.Println("Two")
...
}
1.8 数组和切片
- 数组的声明和初始化
var numbers [5]int
numbers = [5]int{1, 2, 3, 4, 5}
- 使用索引访问数组元素&使用for循环遍历数组
数组的索引从0开始,通过索引访问数组中的元素:
fmt.Println(numbers[3])
for i := 0; i < len(numbers); i++ {
fmt.Println(numbers[i])
}
- 获取数组长度
上一个例子中,是通过使用 len 函数获取数组的长度:
length := len(numbers)
- 多维数组:
Go语言也支持多维数组,例如:
var matrix [2][2]int
matrix = [2][2]int{
{1, 2},
{4, 5}
}
- 切片【重要!!!!!!】
在Go语言中,切片(Slice) 是对数组的一个抽象,它提供了更灵活的方式来操作序列化的数据。切片是一个引用类型,它包含了一个指向数组某个元素的指针、切片的长度以及容量。
切片的优点如下:
-
动态大小: 数组在声明时需要指定固定大小,而切片则可以动态增长或缩小,无需事先指定大小。这使得切片更加灵活,可以根据实际需求进行调整。
-
指针引用: 切片是对数组的引用,不会直接存储数据,而是指向一个数组的一部分(区间)。切片的修改会影响底层数组,多个切片可以共享同一个底层数组,从而节省内存。
-
方便的操作: 切片提供了丰富的内置函数,如添加元素、删除元素、截取切片等,使操作更加方便。
-
长度和容量: 切片有长度(即当前元素个数)和容量(底层数组的长度),长度 <= 容量。容量决定了切片可以增长的最大限度。
-
传递和返回: 切片在函数间传递时只传递引用,而不会复制底层数组,节省内存和提高性能。
-
切片表达式: 可以通过切片表达式从数组、切片或字符串中创建新的切片,而不需要复制数据。
创建切片:
切片表达式的一般形式是 array[start:end],其中 start 是切片的起始索引,end 是切片的结束索引(不包括在切片内)。Go语言也支持从数组、切片或字符串中选择一部分内容,创建一个新的切片:
func main() {
numbers := []int{1, 2, 3, 4, 5}
slice_1 := numbers[1:4]
slice_2 := number[:4]
slice_3 := number[2:]
其中:
slice_1切片包含了 numbers[1] 、 numbers[2] 和 numbers[3] 这3个元素;
slice_2切片包含了 numbers[0] ~ numbers[3] 这4个元素;
slice_2切片包含了 numbers[2] ~ numbers[4] 这3个元素;
修改切片:
slice[0] = 10
fmt.Println(numbers)
修改切片元素会影响底层数组,上述代码运行后输出的为:[1 10 3 4 5]
添加元素:
slice = append(slice, 6)
fmt.Println(slice)
上述代码的输出为:[10 3 4 6]
在切片中添加元素页会影响底层数组,如果底层数组的容量不足以容纳新元素,Go语言会自动创建一个新的更大的底层数组,并将数据从旧数组复制到新数组中。
心得
在这一小节,Go语言语法相比较其他编程语言比如C、C++、Java等的不同之处初见端倪,比如if语句的条件判断之间可以执行一个short statement、switch语句可以把条件判断写在case分支中,还有切片这一重要的数据类型,有了切片就能避免像其他编程语言中那样需要进行多次数据的复制才能对数组进行操作,切片还有丰富的内置函数如添加、删除、截取等,节约了内存,提升了性能。虽然学习其他编程语言后再上手Go语言,不难,但不能因循守旧,要理解并灵活应用Go语言的特性优化代码,提高开发效率。
— — 笔记内容仅供参考,如有错误欢迎指出 — —