Dictionary 如何在围棋中修改地图

Dictionary 如何在围棋中修改地图,dictionary,go,Dictionary,Go,我试图修改“环回”的IPAddr,但它似乎无法直接访问元素 addrs["loopback"][0] = byte(2) //cannot assign to addrs["loopback"][0] 我怎样才能在go内完成 package main import "fmt" type IPAddr [4]byte func main() { addrs := map[string]IPAddr{ "loopback": {127, 0, 0, 1},

我试图修改“环回”的IPAddr,但它似乎无法直接访问元素

addrs["loopback"][0] = byte(2) //cannot assign to addrs["loopback"][0]
我怎样才能在go内完成

package main

import "fmt"

type IPAddr [4]byte

func main() {
    addrs := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    addrs["loopback"][0] = byte(2)
    for n, a := range addrs {
        fmt.Printf("%v: %v\n", n, a)
    }
}

由于映射值不可寻址,因此需要重新分配整个值:

addr := addrs["loopback"]
addr[0] = 2
addrs["loopback"] = addr

如果将映射值类型更改为*IPAddr,则分配

addrs["loopback"][0] = 2
工作。在这种情况下,代码将指定给映射指向的值。此值是可寻址的


我想知道为什么它是不可变的。映射应该类似于Python中的dic,可以直接修改。这不是一个好的比较,因为Python没有像Go的数组类型那样的类型a。如果Python有一个类似Go的数组类型,我认为同样的规则也适用。映射实现者可以自由地在内存中移动值。。映射值是可变的,只是不可寻址。实现它的另一种方法是将IPAddr定义为片:键入IPAddr[]字节