六.切片
go语言中一般很少用数组,用切片更方便一些
切片可以任意更改长度
定义切片
var slice1 []type = make([]T, length, capacity)
切片初始化
func main(){
slice := make([]int, 4, 9)
//slice = [] int{1,2,3}
fmt.Println(len(slice))
fmt.Println(cap(slice))
}
切片截取
func main(){
slice := make([]int, 4, 9)
//slice = [] int{1,2,3}
fmt.Println(len(slice))
fmt.Println(cap(slice))
}
举例
s := make([]string, 3) //创建一个切片 初始长度为3
s[0] = "a"
s[1] = "b"
s[2] = "c"
s = append(s, "d") //数组不能用这个方法
fmt.Println(s) // [a b 3 d]
append和copy方法
s = append(s, “a”)还需要在重新给s赋值呢,虽然切片可以动态变长,其实切片底层是维护了一个数组的,也就是说他初始上就是个数组,只不过有一定大小,如果你append添加元素没有超过数组,那没事,但是超过数组大小,他就会重新弄一个更大的数组然后把值拷贝进去,最后把地址返回出来,所以你得让他重新等于s。
append
func main() {
str := [] int{1,2,3}
str1 := append(str, 3)
fmt.Println(len(str), cap(str))
fmt.Println(len(str1), cap(str1))
fmt.Println(str1, str)
}
copy
cap方法查看其底层数组大小 , len方法是真实元素个数
var s []string
s = append(s, "a")
s = append(s, "b")
s = append(s, "c")
fmt.Println(s)
fmt.Println(cap(s)) // 4
fmt.Println(len(s)) // 3
切片遍历 和python十分相似
func main() {
str := [] int{1,2,3}
for index, value := range str{
fmt.Println(index, value)
}
}
七.MAP
定义MAP
var my_map map[string]string
my_map = make(map[string]string)
使用Map
my_map = make(map[string]string)
my_map["name"] = "jack"
my_map["age"] = "20"
my_map["address"] = "西安"
遍历MAP
for key := range my_map{
fmt.Println(key, my_map[key])
}
删除MAP中的元素
delete(my_map, "name1")
八.range
对于一个 slice(切片) 或者一个 map 的话,我们可以用 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
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m { //返回key和value
fmt.Println(k, v) // a A; b B
}
for k := range m {//返回key
fmt.Println("key", k) // key a; key b
}