goframe中的字符串转换方法

在 GoFrame 框架的gredis.Value类型(Redis 操作返回的结果类型)中,String()Strings()是两个功能完全不同的方法,它们的区别主要体现在返回类型适用场景上,这也是导致你观察到不同输出结果的核心原因。

1. String() 方法

  • 返回类型string(单个字符串)。
  • 作用:将 Redis 返回的单个值转换为字符串形式。
  • 适用场景:当 Redis 操作返回单个值时使用(如GetHGet等命令)。

2. Strings() 方法

  • 返回类型[]string(字符串切片,即多个字符串的集合)。
  • 作用:将 Redis 返回的多个值转换为字符串切片。
  • 适用场景:当 Redis 操作返回多个值时使用(如MGetSMembersLRANGE等命令)。

为什么String()能 “输出结构体”,而Strings()不能?

首先要明确:String()本身不能直接 “输出结构体”,它只能返回 Redis 中存储的原始字符串内容(对你的场景来说,就是序列化后的 JSON 字符串)。你最终能得到结构体,是因为后续通过gjson.DecodeTo将这个 JSON 字符串反序列化为了结构体。

具体到你的代码场景:

  • 你用

    1
    redis.Set(ctx, "res", resJson)

    存储的是单个 JSON 字符串(序列化后的结构体),因此

    1
    redis.Get(ctx, "res")

    返回的是单个值。

    • 调用String()时,会直接返回这个 JSON 字符串(如{"uid":1,"uname":"教学资料"...}),后续可以通过反序列化得到结构体。
    • 调用Strings()时,由于 Redis 返回的是单个值,Strings()会将其包装为长度为 1 的字符串切片([]string{"{"uid":1,"uname":"教学资料"...}"})。而println打印切片时,只会输出切片的内存信息(如[1/1]0xc0004fa1a0),不会显示切片中的具体字符串内容,因此你看不到 JSON 结构,更无法直接得到结构体。

直观对比示例

假设 Redis 中存储的键"res"的值是{"uid":1,"uname":"test"}

1
2
3
4
5
6
7
8
9
10
11
// 获取Redis值
redisValue, _ := redis.Get(ctx, "res")

// 1. 调用String()
s := redisValue.String()
fmt.Println(s) // 输出:{"uid":1,"uname":"test"}(JSON字符串)

// 2. 调用Strings()
ss := redisValue.Strings()
fmt.Println(ss) // 输出:[1/1]0xc000xxxxx(切片的内存表示)
fmt.Println(ss[0]) // 输出:{"uid":1,"uname":"test"}(切片第一个元素才是实际内容)

总结

方法 返回类型 适用场景 你的场景中为何不适用?
String() string 单个值(如Get命令结果) 适用,能直接获取 JSON 字符串,用于反序列化结构体
Strings() []string 多个值(如MGet命令结果) 不适用,会将单个值包装为切片,打印时看不到内容

简单说:单个值用String(),多个值用Strings()。你的场景是单个 JSON 字符串,因此必须用String()才能获取到可反序列化的内容,进而得到结构体。