Построить массивы из структуры - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь построить два массива из структуры. Один со списком свойств, другой со списком значений.

Я сделал несколько попыток, основываясь на некоторых образцах, которые я нашел, которые используют отражение (https://gist.github.com/justincase/5469009)

Это самое близкое к работающей реализации, что я пришел:

func main() {
    type Something struct {
        Some string
        Thing int
    }
    var props []string
    var vals []string

    m := Something{"smth", 666}
    s := reflect.ValueOf(&m).Elem()
    for i := 0; i < s.NumField(); i++ {
        f := s.Field(i)
        props = append(props, s.Type().Field(i).Name)
        value, _ := fmt.Printf("%v", f.Interface())
        vals = append(vals, string(value))
    }
    fmt.Println(props)
    fmt.Println(vals)
}

Я получаю странные результаты после добавления в массивы

smth666[Some Thing]
[ ]

https://play.golang.org/p/LZHtWx-Wbw1

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Проверьте это:

func main() {
    type Something struct {
        Some  string
        Thing int
    }
    var props []string
    var vals []string

    m := Something{"smth", 123}
    s := reflect.ValueOf(m)
    for i := 0; i < s.NumField(); i++ {
        props = append(props, s.Type().Field(i).Name)
        vals = append(vals, fmt.Sprintf("%v", s.Field(i).Interface()))
    }

    fmt.Println(props)
    fmt.Println(vals)
}

Результат:

[Some Thing]
[smth 123]

Он также работает с именованными полями, такими как:

Something{
    Some:  "smth",
    Thing: 123,
}

Также как вам нужен массив (фактически фрагмент!) строк (даже если ваши значения имеют другой тип, например, int), вы можете использовать fmt.Sprintf() для преобразования interface{} в строку

0 голосов
/ 03 марта 2020

ваше решение слишком сложное, нет необходимости в отражении, вы также должны преобразовать int в строку со строками. Itoa () не просто с помощью callig string ()

package main

import (
    "fmt"
    "strconv"
)

func main() {
    type Something struct {
        Some string
        Thing int
    }
    var props []string
    var vals []string

    var x = Something{
        Some:  "a name",
        Thing: 123,
    }
    props = append(props, x.Some)
    vals = append(vals, strconv.Itoa(x.Thing))

    fmt.Println(props)
    fmt.Println(vals)
}

рабочий пример для go детская площадка

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