Невозможно присвоить значение массиву в структуре в Golang [duplicate]

Это работает во всех браузерах -

new Date ('2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

Формат: YYYY-MM-DDTHH: mm: ss.sss

Подробности: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

31
задан Jonathan Leffler 24 September 2015 в 00:41
поделиться

2 ответа

p["HM"] не является довольно регулярным адресуемым значением : хэш-карты могут расти во время выполнения , а затем их значения перемещаются в памяти, а старые местоположения становятся устарели. Если значения в картах рассматривались как обычные адресуемые значения, эти внутренние функции реализации map были бы открыты.

Итак, p["HM"] - это немного другая вещь, называемая выражением индекса в спецификации; если вы будете искать спецификацию для фразы «выражение индекса», вы увидите, что вы можете делать с ними определенные вещи, например, читать их, назначать им и использовать их в выражениях increment / decment (для числовых типов). Но вы не можете все. Они, возможно, предпочли реализовать специальные случаи more , чем они, но я предполагаю, что они не просто упростили ситуацию.

Ваш подход кажется хорошим здесь - вы измените его на обычное назначение, одну из специально разрешенных операций. Другой подход (возможно, хорош для больших структур, которые вы хотите избежать копирования?) - это сделать значение карты регулярным старым указателем , что вы можете изменить базовый объект с помощью:

package main

import "fmt"
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 += 1
  fmt.Printf("age: %d\n", p["HM"].age)
}
44
ответ дан twotwotwo 28 August 2018 в 11:39
поделиться

левая сторона задания должна быть «адресуемой».

https://golang.org/ref/spec#Assignments

Каждый операнд левой стороны должен быть адресуемым, выражением индекса карты или (только для = присваивания) пустым идентификатором.

и https://golang.org / ref / spec # Address_operators

Операнд должен быть адресуемым, то есть либо переменной, либо указателем, либо индексированием фрагмента; или селектор поля адресного структурного операнда; или операцию индексирования массива адресного массива.

как комментарий @ twotwotwo, p["HM"] не адресуется. но, нет такого определения, покажите, что такое «адресуемый операнд структуры» в sepc. Я думаю, что они должны добавить описание для этого.

3
ответ дан Jiang YD 28 August 2018 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: