
本文详解如何在 Go 中从 Redis 获取 JSON 字符串并安全地追加至字符串切片,涵盖 redigo 客户端使用、append 正确用法、内存预分配技巧及 JSON 解析建议。
本文详解如何在 go 中从 redis 获取 json 字符串并安全地追加至字符串切片,涵盖 redigo 客户端使用、`append` 正确用法、内存预分配技巧及 json 解析建议。
在 Go 中,“向数组追加元素”实际对应的是对切片(slice) 使用 append() 函数——因为 Go 没有动态数组类型,切片才是具备动态扩容能力的引用类型。与 JavaScript 的 array.push() 类似,append(slice, element) 是标准且高效的方式,但需注意其返回新切片的语义(原切片可能被重新分配)。
以下是一个完整、生产可用的示例,使用 Redigo(当前最成熟的 Redis Go 客户端之一)获取 JSON 字符串并追加至切片:
package main
import (
"fmt"
"log"
"github.com/garyburd/redigo/redis"
)
func main() {
// 1. 预分配切片容量(可选但推荐:避免频繁内存重分配)
var myJSONs []string
// 若预估数据量,可显式指定容量:myJSONs := make([]string, 0, 16)
// 2. 连接 Redis
conn, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
log.Fatal("Redis connection failed:", err)
}
defer conn.Close()
// 3. 从 Redis 获取 JSON 字符串(例如 key = "user:1001")
jsonStr, err := redis.String(conn.Do("GET", "user:1001"))
if err != nil {
log.Printf("Redis GET failed: %v", err)
// 可选择跳过或返回默认值,而非 panic
jsonStr = `{"id":1001,"name":"anonymous"}`
}
// 4. ✅ 正确追加:append 返回新切片,必须重新赋值
myJSONs = append(myJSONs, jsonStr)
// 5. 多次追加示例
for _, key := range []string{"user:1002", "user:1003"} {
if s, err := redis.String(conn.Do("GET", key)); err == nil {
myJSONs = append(myJSONs, s)
}
}
fmt.Printf("Collected %d JSON strings:\n%+v\n", len(myJSONs), myJSONs)
}⚠️ 关键注意事项:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
append()不会就地修改原切片,而是返回新切片头;务必myJSONs = append(myJSONs, ...),否则追加无效; - 切片底层是数组引用,
make([]string, 0, N)预分配容量可显著提升大批量追加性能; - Redis 返回的
nil值会触发redis.String()错误,应始终检查err,避免 panic; - 若需结构化操作(如解析为
map[string]interface{}或自定义 struct),可在追加前用json.Unmarshal()解析,或统一在后续批量处理:
// 示例:解析后存入结构体切片
type User struct { ID int `json:"id"`; Name string `json:"name"` }
var users []User
for _, jsonStr := range myJSONs {
var u User
if err := json.Unmarshal([]byte(jsonStr), &u); err == nil {
users = append(users, u)
}
}✅ 替代库建议:
-
github.com/go-redis/redis/v9(更现代、上下文支持完善,推荐新项目使用); -
github.com/mediocregopher/radix/v4(轻量、高性能,API 更函数式)。
无论选用哪个库,“获取 → 检查错误 → append 赋值” 这一核心模式保持不变。掌握切片行为与错误处理,即可稳健实现类似 JavaScript push() 的功能。

















