切片
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]
}
- 切片声明和初始化
- 切片不同于数组,可以动态调整长度,并且提供了更多的操作方法。
- 使用
make函数创建一个切片,例如s := make([]string, 3)创建一个长度为 3 的字符串切片s。
- 切片元素赋值
- 切片可以像数组一样通过索引访问和赋值元素,例如
s[0] = "a"将切片s的第一个元素赋值为 "a"。
- 切片可以像数组一样通过索引访问和赋值元素,例如
- 切片元素访问
- 通过索引访问切片元素,例如
s[2]获取切片s的第三个元素。 - 使用
fmt.Println("get:", s[2])打印切片s的第三个元素。
- 通过索引访问切片元素,例如
- 切片长度
- 使用内置函数
len获取切片的长度,例如len(s)返回切片s的长度。 - 使用
fmt.Println("len:", len(s))打印切片s的长度。
- 使用内置函数
- 追加元素
- 使用
append函数向切片追加元素,例如s = append(s, "d")向切片s追加元素 "d"。 - 注意:
append函数会返回一个新的切片,因此需要将结果赋值回原切片变量。
- 使用
- 切片复制
- 使用
copy函数将一个切片的内容复制到另一个切片,例如copy(c, s)将切片s的内容复制到切片c。
- 使用
- 切片操作
- 切片支持类似 Python 的切片操作,例如
s[2:5]表示获取切片s的第 2 到第 5 个元素(不包括第 5 个元素)。 s[:5]表示获取切片s的前 5 个元素。s[2:]表示获取切片s的第 2 个元素到最后一个元素。- 注意:Go 语言的切片操作不支持负数索引。
- 切片支持类似 Python 的切片操作,例如
- 切片初始化
- 切片可以在声明时进行初始化,例如
good := []string{"g", "o", "o", "d"}声明并初始化一个字符串切片good。 - 使用
fmt.Println(good)打印切片good的所有元素。
- 切片可以在声明时进行初始化,例如
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)
}
- map 声明和初始化
- 在 Go 语言中,
map是一种键值对数据结构,类似于其他编程语言中的哈希表或字典。 - 使用
make函数创建一个空的map,例如m := make(map[string]int)创建一个键类型为string,值类型为int的map。
- 在 Go 语言中,
- 存储键值对
- 可以向
map中存储键值对,例如m["one"] = 1将键 "one" 的值设置为 1。
- 可以向
- 访问键值对
- 通过键访问
map中的值,例如m["one"]获取键 "one" 对应的值。 - 使用
fmt.Println(m["one"])打印键 "one" 对应的值。
- 通过键访问
- map 长度
- 使用内置函数
len获取map的长度,例如len(m)返回map中键值对的数量。 - 使用
fmt.Println(len(m))打印map的长度。
- 使用内置函数
- 访问不存在的键
- 访问
map中不存在的键时,会返回值类型的零值,例如m["unknow"]返回 0。 - 使用
r, ok := m["unknow"]获取键 "unknow" 对应的值和一个布尔值ok,表示键是否存在。 - 使用
fmt.Println(r, ok)打印键 "unknow" 对应的值和是否存在的布尔值。
- 访问
- 删除键值对
- 使用
delete函数从map中删除键值对,例如delete(m, "one")删除键 "one" 及其对应的值。
- 使用
- map 初始化
- 可以在声明
map的同时进行初始化,例如m2 := map[string]int{"one": 1, "two": 2}声明并初始化一个map。 - 使用
fmt.Println(m2)打印mapm2的所有键值对。
- 可以在声明
- map 的无序性
- Go 语言中的
map是无序的,遍历时不会按照字母顺序或插入顺序输出,而是随机顺序。
- Go 语言中的
range
range 遍历切片
range可以用于遍历切片,返回两个值:索引和对应位置的值。
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
忽略索引
- 如果不需要索引,可以使用下划线
_来忽略
for _, num := range nums {
sum += num
}
range 遍历 map
range也可以用于遍历map,返回两个值:键和值。
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // a A; b B
}
只遍历键
- 如果只需要键,可以省略值,
for k := range m {
fmt.Println("key", k) // key a; key b
}