我正在使用下面提到的代码从 Redis 发布-订阅中获取输出。在 Redis 期间传递的消息发布字符串 ()。test-message但是,我在订阅阶段获得的输出是 类型 。以下是我在运行下面提到的代码时获得的输出(而不是预期的输出。[]uint8[116 101 115 116 45 109 101 115 115 97 103 101]test-message这是由下面提到的代码中的此行引起的fmt.Println("Output: ", v.Data, reflect.TypeOf(v.Data)).如何在上述行的“订阅”(即测试消息)中获得我想要的正确输出?我觉得我可能需要从转换为以获得正确的输出。[]uint8string我的代码在下面给出。我用这个好的答案作为我的代码的参考。package mainimport ( "fmt" "log" "reflect" "time" "github.com/gomodule/redigo/redis")func main() { fmt.Println("Start redis test.") c, err := redis.Dial("tcp", "localhost:6379") if err != nil { log.Println(err) } else { log.Println("No error during redis.Dial.") } // defer c.Close() val := "test-message" /// Publisher. go func() { c, err := redis.Dial("tcp", "localhost:6379") if err != nil { panic(err) } count := 0 for { c.Do("PUBLISH", "example", val) // c.Do("PUBLISH", "example", // fmt.Sprintf("test message %d", count)) count++ time.Sleep(1 * time.Second) } }() /// End here /// Subscriber. psc := redis.PubSubConn{Conn: c} psc.Subscribe("example") for { switch v := psc.Receive().(type) { case redis.Message: //fmt.Printf("%s: message: %s\n", v.Channel, v.Data) fmt.Println("Output: ", v.Data, reflect.TypeOf(v.Data)) case redis.Subscription: fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count) case error: fmt.Println(v) } time.Sleep(1) } /// End here}
1 回答
慕斯王
TA贡献1864条经验 获得超2个赞
[]uint8与 [] 字节同义,字节切片可以使用转换表达式转换为字节切片。string
将字节片转换为字符串类型将生成一个字符串,其连续字节是切片的元素。
string([]byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}) // "hellø"
string([]byte{}) // ""
string([]byte(nil)) // ""
type MyBytes []byte string(MyBytes{'h', 'e', 'l', 'l', '\xc3',
'\xb8'}) // "hellø"
因此,以下各项应该就足够了:
string(v.Data)
您还可以使用 中的谓词打印字符串而不进行转换:%sfmt
fmt.Printf("Output: %s", v.Data)
示例:https://play.golang.org/p/JICYPfOt-fQ
data := []uint8(`test-message`)
fmt.Println(data)
fmt.Println(string(data))
fmt.Printf("%s\n", data)
- 1 回答
- 0 关注
- 145 浏览
添加回答
举报
0/150
提交
取消
