Golang中如何解决从go-redis获取的字符串无法转换为int的问题
Golang中如何解决从go-redis获取的字符串无法转换为int的问题 我在Go中使用go-redis从Redis获取列表数据。
IDs, err := redisClient.LRange("ID", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(IDs)
for _, ID := range IDs {
id, _ := strconv.Atoi(ID)
fmt.Println(IDs)
}
第一次打印时,它能获取到正确的数据:
37907
61357
45622
69007
但第二次打印得到的结果全是0:
0
0
0
0
如果不转换为整数,它是字符串类型:
cannot use ID (type string) as type int in argument
所以我需要将它作为整数使用。
我使用一个纯Go列表进行了测试:
var a [4]string
a[0] = "1"
a[1] = "2"
a[2] = "3"
a[3] = "4"
for _, i := range a {
id, _ := strconv.Atoi(i)
fmt.Println(id)
}
它可以在没有换行分隔的情况下正常工作:
1
2
3
4
因此,go-redis的.LRange("ID", 0, -1).Result()返回的不仅仅是字符串。
https://godoc.org/github.com/go-redis/redis#Client.LRange
它返回的是*StringSliceCmd。那么该如何转换它呢?
更多关于Golang中如何解决从go-redis获取的字符串无法转换为int的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
id, _ := strconv.Atoi(i)
该语句中的第二个 _ 是其返回的错误值。你应该将这一行改为 id, err := strconv.Atoi(i) 并处理这个错误。
更多关于Golang中如何解决从go-redis获取的字符串无法转换为int的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题在于从Redis获取的字符串包含换行符。strconv.Atoi()无法解析包含换行符的字符串,导致返回0和错误。
解决方案是清理字符串中的换行符:
IDs, err := redisClient.LRange("ID", 0, -1).Result()
if err != nil {
panic(err)
}
for _, ID := range IDs {
// 移除换行符和空格
cleanedID := strings.TrimSpace(ID)
id, err := strconv.Atoi(cleanedID)
if err != nil {
fmt.Printf("转换失败: %v\n", err)
continue
}
fmt.Println(id)
}
或者使用strconv.ParseInt():
for _, ID := range IDs {
cleanedID := strings.TrimSpace(ID)
id, err := strconv.ParseInt(cleanedID, 10, 64)
if err != nil {
fmt.Printf("转换失败: %v\n", err)
continue
}
fmt.Println(id)
}
如果数据包含其他空白字符,可以使用更严格的清理:
import "regexp"
for _, ID := range IDs {
// 移除非数字字符
re := regexp.MustCompile(`[^0-9]`)
cleanedID := re.ReplaceAllString(ID, "")
id, err := strconv.Atoi(cleanedID)
if err != nil {
fmt.Printf("转换失败: %v\n", err)
continue
}
fmt.Println(id)
}
检查Redis中存储的实际数据格式:
for i, ID := range IDs {
fmt.Printf("索引 %d: 原始值=%q, 长度=%d\n", i, ID, len(ID))
fmt.Printf("十六进制: %x\n", ID)
}
这能帮助确认字符串中是否包含不可见字符。

