New to Go. Napotkał ten błąd i nie miał szczęścia w znalezieniu przyczyny lub uzasadnienie dla niego:Dlaczego pojawia się błąd "nie można przypisać" podczas ustawiania wartości do struct jako wartość na mapie?
Jeśli utworzyć struct, mogę oczywiście przypisać i ponowne przypisanie wartości nie ma problemu:
type Person struct {
name string
age int
}
func main() {
x := Person{"Andy Capp", 98}
x.age = 99
fmt.Printf("age: %d\n", x.age)
}
ale jeśli struct to jedna wartość na mapie:
type Person struct {
name string
age int
}
type People map[string]Person
func main() {
p := make(People)
p["HM"] = Person{"Hank McNamara", 39}
p["HM"].age = p["HM"].age + 1
fmt.Printf("age: %d\n", p["HM"].age)
}
Dostaję cannot assign to p["HM"].age
. To wszystko, żadnych innych informacji. http://play.golang.org/p/VRlSItd4eP
Znalazłem sposób obejścia tego - utworzenie funkcji incrementAge
na osobie, która może zostać wywołana, a wynik przypisany do klawisza mapy, np. p["HM"] = p["HM"].incrementAge()
.
Ale moje pytanie brzmi, jaki jest powód tego błędu "nie można przypisać" i dlaczego nie powinienem mieć możliwości bezpośredniego przypisania wartości struct?
'p [" HM "]' nie jest dość regularną wartością wskaźnika, ponieważ wartości na mapie są przenoszone w pamięci, a stare lokalizacje tracą ważność, gdy mapa rośnie. Więc nie możesz wykonywać wszystkich operacji na tym, co możesz zrobić na zwykłym wskaźniku. Poza twoim rozwiązaniem (zmień to na przypisanie, jedną z dozwolonych operacji, która wydaje się tutaj dobra), innym podejściem (może dobrze dla dużych obiektów?) Jest sprawienie, by wartość mapy była zwykłym starym wskaźnikiem, który * możesz * modyfikować obiekt przez: http://play.golang.org/p/n5C4CsKOAV – twotwotwo
Konkretne rzeczy, które możesz zrobić z 'p [" HM "]' są rozrzucone wokół [the spec] (https://golang.org/ref/ spec), jeśli wyszukujesz "wyrażenie indeksu": możesz odczytać wartość, przypisać nową całą wartość, usunąć, zwiększyć/zmniejszyć wartości liczbowe. – twotwotwo
ah to ma sens - próbowałem zrobić wskaźnik "* Person" w jednym punkcie, ale myślę, że zapomniałem utworzyć odniesienie z '&' - wciąż się do tego przyzwyczajam. dziękuję, zrób odpowiedź, a ja bym zaakceptował ... – sbeam