Невозможно вызвать внешнюю структуру непосредственно на структуру map [string] - PullRequest
0 голосов
/ 11 апреля 2019

Я пытался найти правильный способ вызова внешней структуры для типа map[string]struct при демаршаллинге JSON.

Код работает, когда он находится в одном пакете, однако, если он извлекает экспортированный тип, то, похоже, произошла ошибка с функцией Unmarshal.

package animals

type Bird struct {
    Name        string `json:"name"`
    Description string `json:"description"`
}
package main

import (
    "encoding/json"
    "fmt"

    "../animal"
)

func main() {
    birdJson := `{"birds":{"name":"eagle","description":"bird of prey"}}`
    var result map[string]animals.Bird //If Bird is external (animals.Bird) then the Unmarshal breaks
    json.Unmarshal([]byte(birdJson), &result)

    birds := result["birds"]
    fmt.Printf("%s: %s", birds.Name, birds.Description) 
    // These entries will be the struct defaults instead of the values in birdJson
}

https://play.golang.org/p/e4FGIFath4s

Таким образом, приведенный выше код работает нормально, но если type Bird struct{} импортируется из другого пакета, то когда я устанавливаю map[string]animals.Bird, json.Unmarshal не работает.

Обходной путь, который я нашел, состоит в том, чтобы установить новый тип следующим образом: type Bird animals.Bird. Есть ли более элегантный способ сделать это?

Это становится гораздо более серьезной проблемой, если будущие функции требуют оригинального animal.Bird struct, и выдает ошибку при попытке использовать мой новый локальный тип.

Обновление: Я обновил код выше, чтобы показать нерабочий образец. Проблема в том, что значения не будут правильно загружены в map[string]animals.Bird, вместо этого будут загружены значения структуры по умолчанию. Я должен использовать локальную структуру пакета для значений, чтобы unmarshall правильно.

1 Ответ

0 голосов
/ 11 апреля 2019

Прошу прощения, приведенный выше код работает, оказывается, он был частью мошенника func (e *Bird) UnmarshalJSON(b []byte) error {} Я потратил столько времени на это: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...