Считывание результата притока в строку приводит к ошибке: интерфейс {} - это json.Number, а не строка - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь преобразовать приёмный файл record (тип: []interface{}) в []string, чтобы я мог записать его в CSV.

Запись

[2018-12-20T07: 26: 23Z 90 123.2132 12.3232 30 1 пользователь]

Код

s := make([]string, len(record))
for i, v := range record {
    s[i] = v.(string)
}

Но я получил эту ошибку

интерфейс{} это json.Number, а не строка

Я новичок в golang и не слишком знаком с интерфейсом и json

1 Ответ

0 голосов
/ 21 декабря 2018

Я полагаю, что ваш массив записей генерируется примерно так: драйвер вашей базы данных:

record := make([]interface{}, 0, 10)
dec := json.NewDecoder(strings.NewReader(`["2018-12-20T07:26:23Z", 90, 123.2132, 12.3232, 30, 1, "user"]`))
dec.UseNumber()
dec.Decode(&record)

Все числа генерируются как json.Number вместо float64.Поскольку json.Number поддерживает простое преобразование в строку, вы можете использовать этот интерфейс вместе с простым переключателем типа , чтобы сделать это:

s := make([]string, len(record))
for i, v := range record {
    switch val := v.(type) {
    case string:
        s[i] = val
    case json.Number:
        s[i] = val.String()
    default:
        panic(fmt.Sprintf("unhandled type: %T", v))
    }
}

См. Это в действии: https://play.golang.org/p/jD_z94vQ7Wt

...