Go 语言入门指南:基础语法和常用特性解析3| 豆包MarsCode AI刷题

81 阅读3分钟

4数组、切片和map

4.1数组

  • 数组可以存放多个同一类型的数据。
  • Go中不允许可变大小的数组,也不允许使用变量作为数组大小。如有需求,需要使用切片。
  • 声明数组
    • var 数组名 [数组大小]数据类型
      • //数组元素为零值
    • var 数组名 [数组大小]数据类型 = [数组大小]int{数组元素1,数组元素2,数组元素3,...}
    • var 数组名 = [数组大小]int {数组元素1,数组元素2,数组元素3,...}
    • var 数组名 = []int {数组元素1,数组元素2,数组元素3,...}
    • var 数组名 = [数组大小]int {下标1:数组元素1,下标2:数组元素2,下标1:数组元素3,...}
      • //指定下标元素
    • var 数组名 = []int {下标1:数组元素1,下标2:数组元素2,下标1:数组元素3,...}
  • eg
	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)
        

4.2切片

  • slice切片是Go中特有的数组类型。

  • 切片的使用类似数组。

  • 切片是引用类型。进行值传递时,遵守引用传递机制。

  • 切片的长度可变,切片是可以动态变化的数组。

  • 声明切片

切片声明后必须引用数组或者使用make方法产生切片空间后才能使用。

  • var 切片名 []数据类型

    • 切片名 := 数组名[索引1:索引2]
      • //该切片引用该数组[索引1,索引2)范围的数据
    • 切片名 := 数组名[索引1:]
      • //该切片引用该数组[索引1,数组大小 - 1)范围的数据
    • 切片名 := 数组名[:索引2]
      • //该切片引用该数组[0,索引2)范围的数据
    • 切片名 := 数组名[索引1:索引2]
      • //该切片引用该数组[0,数组大小 - 1)范围的数据
    • 切片名 := make([]数据类型, 长度大小, 容量大小)
      • //使用make函数获得该长度大小该容量大小的切片
    • 切片名 := make([]数据类型, 大小)
      • //使用make函数获得长度和容量都是该大小的切片
  • eg

	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]
        
  • 切片常用函数
    • len(v) int:返回切片的长度(包含的元素数量)
    • cap(v) int:返回切片的容量(能包含的最大元素数量)
    • make(Type, IntegerType) Type:分配并初始化一个指定长度的切片
    • make(Type, IntegerType, IntegerType) Type:返回一个指定长度、容量的切片
    • append(slice []Type, ele Type...) slice:对切片进行动态追加。容量不足的场合会扩容。返回追加完毕后的新的切片
    • copy(s []Type, o []Type):将 o 的数据拷贝(值拷贝)到 s。期间,s 的容量不变。s 容量更大时,多余位置保留原样。s 容量更小时,其余元素不保存。

4.3map

  • map(映射)是key - value数据结构。key可以是slice、map、function外的类型,通常使用int或string。
  • 切片是引用类型,遵守引用传递机制。
  • map 的容量达到后,会自动扩容
  • 声明map
  • map的增删改查
  • eg
	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)