Go 语言基础(4) | 青训营笔记

70 阅读2分钟

今天依然是基础语法,附上上一篇留下的小尾巴,切片那个例子的运行结果应该是:

get: c
len: 3
[a b c d e f]
[a b c d e f]
[c d e]
[a b c d e]
[c d e f]
[g o o d]

Go 的 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)
}

在其他语言里这个数据结构可能称为哈希(表)或者字典。还是用 make(map[type1]type2) 来创建一个空 map,中括号内的 type1key 的类型,外面的 type2value 的类型。

写入键值对还是用方括号,读取某个键的值也用方括号,删除键值对用 delete(),读取值的时候可以加一个 ok 来获取这个键是不是存在。

遍历 map 的时候是完全无序的,不会按照字母顺序输出也不会按照插入顺序输出。

例子运行结果如下:

map[one:1 two:2]
2
1
0
0 false
map[one:1 two:2] map[one:1 two:2]

Go 的 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
	}
}

range 用于快速遍历 slicemap。遍历 slice 的结果分两部分,索引和值。如果不需要索引,就用一个下划线把位置占上。

运行结果如下:

index: 0 num: 2
9
a A
b B
key a
key b

Go 的函数

来个小例子:

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 里面类型是后置的,写在变量名后面的,而且函数是支持有多个返回值,第一个返回值是和其他语言一样的返回值,后面的返回值是错误信息状态信息之类的。

例子运行结果如下:

3
A true

Go 的指针

来个小例子:

package main

import "fmt"

func add2(n int) {
	n += 2
}

func add2ptr(n *int) {
	*n += 2
}

func main() {
	n := 5
	add2(n)
	fmt.Println(n) // 5
	add2ptr(&n)
	fmt.Println(n) // 7
}

Go 对指针操作的支持有限,用法也和 CC++ 一样,传参的时候用这个比较多,保证操作的是真正的变量而不是原变量的拷贝。

运行结果如下:

5
7