Go-02 | 豆包MarsCode AI 刷题”

67 阅读7分钟

这段笔记讲解了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 遍历切片 numsi 是索引,num 是对应索引位置的值。range 可以用于遍历切片、数组、映射、字符串等。
  • sum += num: 计算 nums 中所有元素的和。
  • for k, v := range m { ... }: 遍历映射 mk 是键,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 类型的参数 ab,返回它们的和,返回类型也是 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(...): 函数返回多个值时,可以通过解构赋值来接收它们。

应用场景:

  • 自定义函数用于将复杂的逻辑分解为可重用的模块,适合代码复用、简化和增强可读性。
  • 使用多重返回值可以在返回计算结果的同时,提供额外的状态信息,如查找是否成功等,常用于查找、验证和错误处理等场景。
  • 简化参数声明可以提高代码简洁性和可读性,尤其是在多个参数类型相同的情况下。