数组和切片的区别
map
key 经过 hash 后共 64 位,根据 hmap 中 B 的值,计算它到底要落在哪个桶时,桶的数量为 2^B,如 B=5,那么用 64 位最后 5 位表示第几号桶,在用hash 值的高 8 位确定在 bucket 中的存储位置,当前 bmap 中的 bucket 未找到,则查询对应的 overflow bucket,对应位置有数据则对比完整的哈希值,确定是否是要查找的数据。如果当前 map 处于数据搬移状态,则优先从oldbuckets 查找。
变化
数组长度是不可变
切片可变,每次扩容为1/4
传递
数组是值传递,切片是引用传递
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
fmt.Printf("a的值%+v\n", a)
for i := 0; i < len(a); i++ {
if i == 0 {
a[1] = 4
}
fmt.Printf("a[%d]的值是:%d\n", i, a[i])
}
fmt.Printf("a的值%+v\n", a)
for index, value := range a {
if index == 0 {
a[1] = 5
}
fmt.Printf("a[%d]的值是:%d\n", index, value)
}
fmt.Printf("a的值%+v\n", a)
b := []int{1, 2, 3}
fmt.Printf("b的值%+v\n", b)
for i := 0; i < len(b); i++ {
if i == 0 {
b[1] = 4
}
fmt.Printf("b[%d]的值是:%d\n", i, b[i])
}
fmt.Printf("b的值%+v\n", b)
for index, value := range a {
if index == 0 {
b[1] = 5
}
fmt.Printf("b[%d]的值是:%d\n", index, value)
}
fmt.Printf("b的值%+v\n", b)
}
最终的结果是:
a的值[1 2 3]
a[0]的值是:1
a[1]的值是:4
a[2]的值是:3
a的值[1 4 3]
a[0]的值是:1
a[1]的值是:4
a[2]的值是:3
a的值[1 5 3]
b的值[1 2 3]
b[0]的值是:1
b[1]的值是:4
b[2]的值是:3
b的值[1 4 3]
b[0]的值是:1
b[1]的值是:5
b[2]的值是:3
b的值[1 5 3]
数组或者切片在 range
里,数组是值传递,value会原样读取原本的数组值,而切片是地址传递,所以当切片变更之后后面显示的就会变更了。
需要注意的就是切片在 range
里修改了值,那么会影响到后续的遍历
作者:admin 创建时间:2022-05-25 11:11
最后编辑:admin 更新时间:2023-04-10 15:46
最后编辑:admin 更新时间:2023-04-10 15:46