GO语言基础-3 | 青训营笔记

72 阅读2分钟

注:本文搬运了一些我青训营期间听课的笔记(我一般直接用注释或者记笔记本上),不保证正确性,而且有些地方可能比较乱,大家看个乐就行了。

基础语法部分

map

map在其他语言中它叫哈希或者字典(python),是实际工作中最常用到的数据结构之一,由若干key/value对组成。

从第14行可以看出,在map中读取v值的时候,可以在后面加一个ok变量(bool),来确认map中是否有这个key存在,存在为true,不存在为false。

需要注意的是,map中元素的存储是无序的,遍历时不会按照插入顺序输出,也不会按照字母顺序输出,是随机顺序输出。也就是说,第21行输出结果中m2和m3的元素顺序可能是不一样的。

package main

import "fmt"

func main() {
	m := make(map[string]int) // 创建一个map,里面有key和value
	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)
}

range(包含一点点for知识点)

range可用于遍历slice或map。

对于slice,如果设置了两个返回参数,则分别返回index和value,如果不需要索引可以用下划线忽略(_, num);如果只有设置了一个参数,则返回value,因为就返回个index没啥意义。

对于map,如果设置了两个返回参数,则分别返回key和value;如果只设置了一个参数,则返回key(区别于上面slice的情况)。另外从19行的输出结果可以看出,用range遍历map时元素的输出顺序是随机的,因为map中元素的存储是无序的。

这里既然有个for循环那就顺便补充一点关于for的知识点。首先go语言中循环功能的实现只有for,不像c里面还有while、do while等乱七八糟的,因为本质功能都是一样的。另外go语言中for后面的小括号被去除了,但是大括号却成了必要的(即使下面只有一句话),不然就不好确定从哪里开始循环了。

package main

import "fmt"

func main() {
	nums := []int{2, 3, 4} // 这是一个slice
	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
	}
}