为什么不能在Go中的地图内分配数组?

EMB*_*LEM 7 arrays dictionary go

这是一个简短的例子来证明:

package main

import "fmt"

func main() {
    array := [3]int{1, 2, 3}
    array[0]++ // Works
    slice := make([]int, 3)
    for i := range slice {
        slice[i] = i + 1
    }
    arrayMap := make(map[int][3]int)
    sliceMap := make(map[int][]int)
    arrayMap[0] = array
    sliceMap[0] = slice
    //arrayMap[0][0]++ // Does not compile: "cannot assign to arrayMap[0][0]"
    sliceMap[0][0]++
    fmt.Println(arrayMap)
    fmt.Println(sliceMap)
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能修改数组的内容,如果它在地图中,即使它们在地图外是可变的?为什么这适用于切片?

edu*_*911 5

对于地图,其值不可寻址.也就是说,当您使用a value type(数组value types在Go中)时,您无法使用该值来处理该值++.

但是,如果您使用reference type(切片reference types在Go中),您可以像在示例中已经提到的那样.

无论Map中使用何种类型,都适用.

我们可以做的一件事是使用该类型的ptr地址.例如,如果你获取数组的地址,那么它应该工作:

游乐场:http://play.golang.org/p/XeIThVewWD

package main

import "fmt"

func main() {
    array := [3]int{1, 2, 3}
    slice := []int{1, 2, 3}

    arrayMap := make(map[int]*[3]int) // use the pointer to the type
    sliceMap := make(map[int][]int)
    arrayMap[0] = &array // get the pointer to the type
    sliceMap[0] = slice

    arrayMap[0][0]++ // works, because it's a pointer to the array
    sliceMap[0][0]++

    fmt.Println(*arrayMap[0])
    fmt.Println(sliceMap[0])
}

// outputs
[2 2 3]
[2 2 3]
Run Code Online (Sandbox Code Playgroud)

这可以正常工作并将[0]索引array增加到2.

它的工作原理是因为围棋欣然提领读时,指针为我们的价值和重新分配期间更新的价值.