0

我正在使用下面提到的代码从 Redis Publish-Subscribe 获取输出。在 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)).

如何在上述行(即)中的订阅中获得我想要的正确输出test-message我觉得我可能需要转换 from[]uint8才能string获得正确的输出。

我的代码如下。我用这个很好的答案作为我的代码的参考。

package main

import (
    "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

}
4

1 回答 1

3

[]uint8是同义词,[]byte并且可以string使用转换表达式将字节切片转换为。

  1. 将字节切片转换为字符串类型会产生一个字符串,其连续字节是切片的元素。
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)

您还可以使用%s动词 in打印字符串而不进行转换fmt

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)
于 2021-08-19T03:40:55.117 回答