【问题标题】:How to dynamically naming struct items in golang?如何在golang中动态命名结构项?
【发布时间】:2018-10-17 13:16:59
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 这样不行:)
  • 等等,你是说 redis 键是 per-urlreq 吗?您扫描到的结构可以设置键名,也许您可​​以添加一个字段来保留 urlreq 值并将其用于您以后需要做的任何事情(大概类似于编组到 JSON)
  • 结构字段是在编译时定义的,而不是在运行时定义的。也许你应该改用地图。
  • 是的,我认为地图可能是合适的数据结构
  • 谁能给我一个我可以扫描结构的地图的解决方案?

标签: go redis redigo


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多