-3

我正在使用 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);

提前致谢。

4

2 回答 2

0

这不是方式,去表现你应该使用反射

v := reflect.ValueOf(qwInfo).Elem().FieldByName(field) 
于 2018-10-17T21:07:13.987 回答
0

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,
}
于 2018-10-18T02:59:54.773 回答