这段笔记讲解了Go语言中常用的数据结构和控制语句,包括数组、切片、映射、for range 遍历、以及函数定义与使用,涵盖了它们的基本语法、核心知识点和应用场景,如数组用于固定大小的数据集合、切片用于动态大小的集合操作、映射用于键值对存储和快速查找、for range 用于高效遍历集合、以及函数用于代码复用和多重返回值处理。请根据目录快速检索和入门。
走进 Go 语言基础语法
01-array
package main
import "fmt"
func main() {
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
核心知识点:
数组是固定大小的有序元素集合,Go中的数组元素类型必须一致。多维数组的概念也在这里被展示,可以实现矩阵的存储。
基本语法:
var a [5]int: 定义了一个包含 5 个整数元素的数组a,未显式赋值的元素默认值为零值(0)。a[4] = 100: 数组元素通过索引访问和赋值,索引从0开始。len(a): 使用len函数获取数组长度。b := [5]int{1, 2, 3, 4, 5}: 使用大括号直接赋值初始化数组b。var twoD [2][3]int: 定义了一个 2x3 的二维数组。- 双重
for循环用于遍历并初始化二维数组twoD。
应用场景:
- 数组用于存储具有固定大小的数据集合,适合处理需要快速访问和修改的连续内存数据。
- 多维数组可用于表示矩阵、表格等结构化数据,常见于数学运算、图像处理等场景。
- 通过
len获取数组长度,可用于遍历操作,避免数组越界。
02-slice
package main
import "fmt"
func main() {
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}
核心知识点:
这段代码展示了Go语言中的切片(slice)的使用。切片是基于数组的抽象,是一种灵活且功能强大的数据结构,具有动态大小。它提供了比数组更方便的操作,例如追加、复制和子切片。
基本语法:
s := make([]string, 3): 使用make函数创建一个初始长度为 3 的字符串切片s,元素初始值为零值(空字符串)。s[i] = "value": 切片可以像数组一样通过索引访问和赋值。len(s): 使用len函数获取切片的长度。append(s, ...): 使用append函数向切片追加元素,返回一个包含新元素的切片。copy(c, s): 使用copy函数将切片s的内容复制到切片c。- 切片的切片操作(如
s[2:5])用于获取子切片:s[2:5]: 获取从索引2开始到5(不包括5)的子切片。s[:5]: 获取从开头到索引5(不包括5)的子切片。s[2:]: 获取从索引2到末尾的子切片。
good := []string{"g", "o", "o", "d"}: 使用字面量创建和初始化切片。
应用场景:
- 切片用于处理不固定大小的集合,适合需要频繁添加、删除或操作部分元素的情况。
- 使用
append可以动态增加元素,copy可用于创建切片的副本,适用于需要对数据进行备份或临时处理的场景。 - 子切片操作简化了对集合部分的访问,适合处理需要截取、过滤或分区的数据。
03-map
package main
import "fmt"
func main() {
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
}
核心知识点:
这段代码展示了Go语言中的映射(map)的使用。map 是一种键值对数据结构,可以将唯一的键映射到特定的值。map 在Go中用于高效地查找和存储数据,类似于其他语言中的字典或哈希表。
基本语法:
m := make(map[string]int): 使用make函数创建一个键类型为string,值类型为int的空映射。m["key"] = value: 使用键访问和赋值,键必须是唯一的。m["unknow"]: 如果访问不存在的键,返回该值类型的零值(int类型的零值是0)。r, ok := m["unknow"]: 使用多返回值来判断键是否存在,ok为布尔值,表示键是否存在。delete(m, "key"): 使用delete函数从map中删除键值对。m2 := map[string]int{"one": 1, "two": 2}: 使用字面量初始化map。var m3 = map[string]int{"one": 1, "two": 2}: 另一种字面量方式初始化map。
应用场景:
map常用于需要快速查找、插入或删除元素的场景,例如实现查找表、缓存和统计数据。- 判断键是否存在可以避免对不存在的键进行误操作,适合数据完整性校验的场景。
- 删除键值对适合需要更新数据的情况,例如清理旧数据或重置某个键的状态。
04-range
package main
import "fmt"
func main() {
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) // index: 0 num: 2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
}
核心知识点:
这段代码展示了Go语言中 for range 结构的使用。for range 是一种用于遍历集合的语法,支持对切片(slice)、映射(map)等数据结构进行迭代,方便地获取键和值。
基本语法:
for i, num := range nums { ... }: 使用range遍历切片nums,i是索引,num是对应索引位置的值。range可以用于遍历切片、数组、映射、字符串等。sum += num: 计算nums中所有元素的和。for k, v := range m { ... }: 遍历映射m,k是键,v是对应的值。for k := range m { ... }: 只需要键而不需要值时,可以省略第二个变量。
应用场景:
for range用于高效遍历各种集合,简化了循环中的索引访问操作,适合处理列表、字典等数据结构。- 遍历切片时,可以使用索引来进行条件判断和处理特定元素。
- 遍历映射时,
range既可以获取键值对,也可以只获取键,适合处理需要同时操作键和值或只需键的情况。
05-func
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
res := add(1, 2)
fmt.Println(res) // 3
v, ok := exists(map[string]string{"a": "A"}, "a")
fmt.Println(v, ok) // A True
}
核心知识点:
这段代码展示了Go语言中函数的定义与使用。函数是Go语言的基本代码复用结构,可以通过传递参数和返回值来执行特定操作。此外,Go中的函数支持多重返回值,这对于表示执行结果的状态非常有用。
基本语法:
func add(a int, b int) int: 定义一个函数add,它接受两个int类型的参数a和b,返回它们的和,返回类型也是int。func add2(a, b int) int: 参数类型相同的多个参数可以通过省略重复的类型名称进行简化。func exists(m map[string]string, k string) (v string, ok bool): 函数exists有两个返回值,一个是v(找到的值),另一个是ok(表示键是否存在),这种形式很适合同时返回查找结果和状态。v, ok := exists(...): 函数返回多个值时,可以通过解构赋值来接收它们。
应用场景:
- 自定义函数用于将复杂的逻辑分解为可重用的模块,适合代码复用、简化和增强可读性。
- 使用多重返回值可以在返回计算结果的同时,提供额外的状态信息,如查找是否成功等,常用于查找、验证和错误处理等场景。
- 简化参数声明可以提高代码简洁性和可读性,尤其是在多个参数类型相同的情况下。