Как динамически именовать элементы структуры в golang? - PullRequest
0 голосов
/ 17 октября 2018

Я использую redigo, и ScanStruct очень полезен.Однако очевидно, что я пытаюсь ввести urlhost и urlreq, и эти значения генерируются динамически на основе фактического URI пользователя.

Очевидно, что приведенный ниже код не работает, так как мне добиться того, чего я хочу, с помощьюбыть в состоянии динамически именовать мою структуру, чтобы я мог ScanStruct правильно?

   func GetInfo(urlhost string, urlreq string) {


    type qwInfo struct {
         "s"+urlreq int
         "c"+urlreq []byte
         "t"+urlreq int
    }

    var QwInfo qwInfo

    c := pool.Get()
    defer c.Close()

    values, _ := redis.Values(c.Do("HMGET", urlhost, "s"+urlreq, "c"+urlreq, "t"+urlreq))

    redis.ScanStruct(values, &QwInfo);

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В библиотеке redigo есть три доступные функции для сканирования: Scan(), ScanSlice(), ScanStruct().

ScanStruct() не может использоваться в вашем случае, потому что структурная схема должна быть явно определена во время компиляции, она не может быть динамической.

Вместо этого используйте Scan().Создайте несколько переменных для извлечения значений, затем, после завершения процесса сканирования, поместите все эти переменные в один map объект.

Пример:

c := pool.Get()
defer c.Close()

values, _ := redis.Values(c.Do("HMGET", urlhost, "s"+urlreq, "c"+urlreq, "t"+urlreq))

var s int = -1
var c []byte
var t int = -1
redis.Scan(values, &s, &c, &t))

qwInfo := map[string]interface{}{
    "s"+urlreq: s,
    "c"+urlreq: c,
    "t"+urlreq: t,
}
0 голосов
/ 18 октября 2018

Это не тот путь, иди веди себя, ты должен использовать отражение вместо

v := reflect.ValueOf(qwInfo).Elem().FieldByName(field) 
...