2015-07-26 4 views
4

Я пытаюсь изменить IPAddr для «loopback», но, похоже, не имеет прямого доступа к элементу.Как изменить карту в go

addrs["loopback"][0] = byte(2) //cannot assign to addrs["loopback"][0] 

Как я могу это сделать в пределах?

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) 
    } 
} 

ответ

4

Поскольку значения карты не адресация, вам нужно переназначить все значение:

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

playground example

Если изменить тип значения карты до * IPADDR, то назначения

addrs["loopback"][0] = 2 

работает. В этом случае код присваивает значение, на которое указывает карта. Это значение адресуется.

playground example

+0

Мне интересно, почему это неизменно. карта должна быть похожа на dic в Python, которая может быть изменена напрямую. – Alfred

+1

Это не очень хорошее сравнение, потому что у Python нет типа типа типа массива Go. Если бы у Python был тип типа массива Go, я бы подумал, что применяется то же правило. Создатели карт, что свобода перемещения ценностей в памяти. Значение карты изменчиво, это просто не адресуемо. –

+0

Другим способом достижения этого является определение IPAddr как среза: type IPAddr [] byte – Alfred

Смежные вопросы