Назначение для карты в Голанге - PullRequest
3 голосов
/ 12 августа 2011

В следующем фрагменте кода, что я делаю не так?

type Element interface{}

func buncode(in *os.File) (e Element) {
    <snip>
    e = make(map[string]interface{})
    for {
        var k string = buncode(in).(string)
        v := buncode(in)
        e[k] = v
    }
    <snip>
}

Компиляция дает мне эту ошибку:

gopirate.go:38: invalid operation: e[k] (index of type Element)

Двойная овца T eff?

1 Ответ

2 голосов
/ 12 августа 2011

В функции buncode вы объявляете e Element, где type e Element interface{}. Переменная e является скалярным значением, которое вы пытаетесь проиндексировать.

Типы

Статический тип (или просто тип) переменной - это тип, определенный его декларация. Переменные типа интерфейса также имеют динамический тип, который является фактическим типом значения, хранящегося в переменная во время выполнения. Динамический тип может изменяться во время выполнения, но всегда присваивается статическому типу интерфейсной переменной. За неинтерфейсные типы, динамический тип всегда является статическим типом.

Статический тип e равен Element, скаляр. Динамический тип e равен map[string]interface{}.

Вот пересмотренная, компилируемая версия вашего кода.

type Element interface{}

func buncode(in *os.File) (e Element) {
    m := make(map[string]interface{})
    for {
        var k string = buncode(in).(string)
        v := buncode(in)
        m[k] = v
    }
    return m
}

Почему вы делаете рекурсивные вызовы на buncode?

...