今天依然是基础语法,附上上一篇留下的小尾巴,切片那个例子的运行结果应该是:
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,中括号内的 type1 是 key 的类型,外面的 type2 是 value 的类型。
写入键值对还是用方括号,读取某个键的值也用方括号,删除键值对用 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 用于快速遍历 slice 和 map。遍历 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 对指针操作的支持有限,用法也和 C 或 C++ 一样,传参的时候用这个比较多,保证操作的是真正的变量而不是原变量的拷贝。
运行结果如下:
5
7