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)
为什么我不能修改数组的内容,如果它在地图中,即使它们在地图外是可变的?为什么这适用于切片?
对于地图,其值不可寻址.也就是说,当您使用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.
它的工作原理是因为围棋欣然提领读时,指针为我们的价值和重新分配期间更新的价值.
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |