我是雷迪戈,从一个redis数据库连接。如何将一种类型的[]interface {}{[]byte{} []byte{}} 转换为一组字符串?在本例中,希望得到两个字符串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?
}发布于 2012-09-28 06:14:42
查看模块的源代码,您可以看到从接收返回的类型签名将是:
func (c *conn) Receive() (reply interface{}, err error)
在你的例子中,你使用的是MultiBulk
func MultiBulk(v interface{}, err error) ([]interface{}, error)
这给出了一个片中多个interface{}的答复:[]interface{}。
在非类型化的interface{}之前,您必须像这样断言其类型:
十.(T)
其中T是一种类型(例如,int、string等)
在您的示例中,您有一个接口片段(类型:[]interface{}),因此,如果您想要一个string,您需要首先断言每个接口都有类型[]字节,然后将它们转换为字符串(例如:
for _, x := range reply {
var v, ok = x.([]byte)
if ok {
fmt.Println(string(v))
}
}下面是一个例子:http://play.golang.org/p/ZifbbZxEeJ
您还可以使用类型开关来检查返回的数据类型:
开关
for _, y := range reply {
switch i := y.(type) {
case nil:
printString("x is nil")
case int:
printInt(i) // i is an int
etc...
}
}或者,正如有人提到的,使用内置的redis.String等方法来检查并转换它们。
我认为关键是,每一个都需要转换,您不能只是作为一个块(除非您编写一个方法这样做!)。
发布于 2012-09-27 22:23:35
看看模块源代码
// String is a helper that converts a Redis reply to a string.
//
// Reply type Result
// integer format as decimal string
// bulk return reply as string
// string return as is
// nil return error ErrNil
// other return error
func String(v interface{}, err error) (string, error) {redis.String将在(string, error)中转换(v interface{}, err error)
reply, err := redis.MultiBulk(c.Receive())代之以
s, err := redis.String(redis.MultiBulk(c.Receive()))发布于 2020-05-24 07:59:58
由于现在不推荐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
}https://stackoverflow.com/questions/12629801
复制相似问题