gosexy / redis

Redis client for Go that maps the full redis command list into equivalent Go functions.
MIT License
167 stars 44 forks source link

Using Scan: "Unsupported conversion: redis array to string" #33

Closed taf2 closed 9 years ago

taf2 commented 9 years ago

the following

package main

import (
  "fmt"
  "log"
  "menteslibres.net/gosexy/redis"
)

func main() {
  var rs *redis.Client = redis.New()
  err := rs.Connect("127.0.0.1", 6379)
  if err != nil {
    log.Printf("Connect failed: %s\n", err.Error())
    return
  }
  _, err = rs.Select(5)
  if err != nil {
    log.Printf("Could not ping: %s\n", err.Error())
    return
  }
  poolKeys, err := rs.Keys(fmt.Sprintf("pool.%d.*", 25))
  if poolKeys != nil && len(poolKeys) > 0 {
    for i := 0; i < len(poolKeys); i++ {
      log.Printf("key: %s\n", poolKeys[i])
    }
    log.Printf("total keys: %d\n", len(poolKeys))
  }
  result, err := rs.Scan(0, []byte("MATCH"), []byte("pool.25.*"), []byte("COUNT"), []byte("10"))
  if err != nil {
    log.Printf("Could not scan: %s\n", err.Error())
    return
  }
  log.Printf("result: %s\n", result)
}
xiam commented 9 years ago

Thank you Todd, Scan() is now returning a more appropriate type but it can get complicated when arrays with array elements are involved, I'm attaching the same example with a snippet that walks over results:

package main

import (
    "fmt"
    "github.com/xiam/resp"
    "log"
    "menteslibres.net/gosexy/redis"
    "reflect"
)

func main() {
    var rs *redis.Client = redis.New()
    err := rs.Connect("10.1.2.201", 6379)
    if err != nil {
        log.Printf("Connect failed: %s\n", err.Error())
        return
    }
    _, err = rs.Select(5)
    if err != nil {
        log.Printf("Could not ping: %s\n", err.Error())
        return
    }
    poolKeys, err := rs.Keys(fmt.Sprintf("pool.%d.*", 25))
    if poolKeys != nil && len(poolKeys) > 0 {
        for i := 0; i < len(poolKeys); i++ {
            log.Printf("key: %s\n", poolKeys[i])
        }
        log.Printf("total keys: %d\n", len(poolKeys))
    }
    //result, err := rs.Scan(0, []byte("MATCH"), []byte("pool.25.*"), []byte("COUNT"), []byte("10"))
    // You can use multiple types and they'll get converted to []byte automatically.
    result, err := rs.Scan(0, "MATCH", "pool.25.*", "COUNT", 10)
    if err != nil {
        log.Printf("Could not scan: %s\n", err.Error())
        return
    }
    for i := range result {
        log.Printf("result (%d), type: %v, value: %v\n", i, reflect.TypeOf(result[i]), result[i])
        if message, ok := result[i].(*resp.Message); ok {
            log.Printf("\ttype: %v, value: %v\n", reflect.TypeOf(message.Interface()), message.Interface())
        }
    }
}
taf2 commented 9 years ago

Fantastic! Thanks @xiam