goframe中的字符串转换方法
在 GoFrame 框架的gredis.Value类型(Redis 操作返回的结果类型)中,String()和Strings()是两个功能完全不同的方法,它们的区别主要体现在返回类型和适用场景上,这也是导致你观察到不同输出结果的核心原因。
¶1. String() 方法
- 返回类型:
string(单个字符串)。 - 作用:将 Redis 返回的单个值转换为字符串形式。
- 适用场景:当 Redis 操作返回单个值时使用(如
Get、HGet等命令)。
¶2. Strings() 方法
- 返回类型:
[]string(字符串切片,即多个字符串的集合)。 - 作用:将 Redis 返回的多个值转换为字符串切片。
- 适用场景:当 Redis 操作返回多个值时使用(如
MGet、SMembers、LRANGE等命令)。
¶为什么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 | // 获取Redis值 |
¶总结
| 方法 | 返回类型 | 适用场景 | 你的场景中为何不适用? |
|---|---|---|---|
String() |
string |
单个值(如Get命令结果) |
适用,能直接获取 JSON 字符串,用于反序列化结构体 |
Strings() |
[]string |
多个值(如MGet命令结果) |
不适用,会将单个值包装为切片,打印时看不到内容 |
简单说:单个值用String(),多个值用Strings()。你的场景是单个 JSON 字符串,因此必须用String()才能获取到可反序列化的内容,进而得到结构体。