数组和切片的区别

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