Redis redigo,SMEMBERS,如何获取字符串
我将从Go连接到redis数据库如何将一种类型的Redis redigo,SMEMBERS,如何获取字符串,redis,go,Redis,Go,我将从Go连接到redis数据库如何将一种类型的[]接口{}{[]字节{}[]字节{}}转换为一组字符串?在这种情况下,我希望得到两个字符串Hello和World package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", ":6379") defer c.Close() if err != nil
[]接口{}{[]字节{}[]字节{}}
转换为一组字符串?在这种情况下,我希望得到两个字符串Hello
和World
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", ":6379")
defer c.Close()
if err != nil {
fmt.Println(err)
}
c.Send("SADD", "myset", "Hello")
c.Send("SADD", "myset", "World")
c.Flush()
c.Receive()
c.Receive()
err = c.Send("SMEMBERS", "myset")
if err != nil {
fmt.Println(err)
}
c.Flush()
// both give the same return value!?!?
// reply, err := c.Receive()
reply, err := redis.MultiBulk(c.Receive())
if err != nil {
fmt.Println(err)
}
fmt.Printf("%#v\n", reply)
// $ go run main.go
// []interface {}{[]byte{0x57, 0x6f, 0x72, 0x6c, 0x64}, []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}}
// How do I get 'Hello' and 'World' from this data?
}
查看
redis.String
将转换(v接口{},错误)
中的(字符串,错误)
取代
s, err := redis.String(redis.MultiBulk(c.Receive()))
查看模块的源代码,您可以看到:
func(c*conn)Receive()(回复接口{},错误)
在您的情况下,您正在使用:
func多块(v接口{},错误)([]接口{},错误)
这将在一个片中给出多个接口{}
的回复:[]接口{}
在非类型化的接口{}
之前,您必须这样做:
x、 (T)
其中,T
是一种类型(例如,int
,string
等)
在您的例子中,您有一部分接口(类型:[]接口{}
),因此,如果您想要一个字符串
,您需要首先声明每个接口都有类型[]字节,然后将它们转换为字符串,例如:
for _, x := range reply {
var v, ok = x.([]byte)
if ok {
fmt.Println(string(v))
}
}
下面是一个例子:
您还可以使用类型开关来检查返回的数据类型:
或者,正如有人提到的,使用内置的redis.String
等方法来检查并转换它们
我认为关键是,每一个都需要转换,你不能只是把它们作为一个块来做(除非你写了一个方法来这么做!)。既然现在不推荐使用
redis.MultiBulk()
,那么使用redis.Values()
并将结果转换成String
可能是一个好方法:
import "github.com/gomodule/redigo/redis"
type RedisClient struct {
Conn redis.Conn
}
func (r *RedisClient) SMEMBERS(key string) interface{} {
tmp, err := redis.Values(r.Conn.Do("smembers", key))
if err != nil {
fmt.Println(err)
return nil
}
res := make([]string, 0)
for _, v := range tmp {
res = append(res, string(v.([]byte)))
}
return res
}
我得到了以下错误:
redigo:String的意外类型,从您上面的行中得到了类型[]interface{}
。@topskip:可能没有必要这样说,因为这个问题已经有了答案,但未排除的类型错误可能是因为您插入了一段接口,而不仅仅是接口。如果您在接口的各个部分进行了枚举并使用了redis.String,它可能会工作得很好。这是所有答案中最正确的答案。SMEMBERS返回一个值数组,而不是单个值。
for _, x := range reply {
var v, ok = x.([]byte)
if ok {
fmt.Println(string(v))
}
}
for _, y := range reply {
switch i := y.(type) {
case nil:
printString("x is nil")
case int:
printInt(i) // i is an int
etc...
}
}
import "github.com/gomodule/redigo/redis"
type RedisClient struct {
Conn redis.Conn
}
func (r *RedisClient) SMEMBERS(key string) interface{} {
tmp, err := redis.Values(r.Conn.Do("smembers", key))
if err != nil {
fmt.Println(err)
return nil
}
res := make([]string, 0)
for _, v := range tmp {
res = append(res, string(v.([]byte)))
}
return res
}