你遇到的错误是因为在 Redis 中,ipv4Addresses
字段存储为一个字符串(例如 "192.168.1.1"
),而你的 Go 结构体 NfProfile
期望这个字段是一个字符串切片([]string
)。因此,Go 在尝试将字符串解码到字符串切片时会抛出错误。
解决方案
有几种方法可以解决这个问题:
1. 修改数据存储方式
如果可能的话,将 IP 地址存储为一个数组或以某种可分隔的格式。假设你希望将多个 IP 地址保存为一个 JSON 数组,你可以这样做:
HSET nfprofile:NF_INSTANCE_ID_12222 ipv4Addresses '["192.168.1.1", "10.0.0.1"]'
在这种情况下,使用 JSON 格式来表示地址列表,这样 Go 的 JSON 解码器就能正确解析。
2. 修改 Go 代码以支持不同类型
如果你不能更改 Redis 中的数据格式,可以在你的 Go 代码中添加自定义逻辑来处理从 Redis 获取的数据。例如,将其作为单个字符串处理,并在需要时进行拆分:
type NfProfile struct {
Ipv4Addresses []string `json:"ipv4Addresses"`
}
// 自定义函数来处理解析逻辑
func (p *NfProfile) UnmarshalJSON(data []byte) error {
var raw struct {
Ipv4Addresses string `json:"ipv4Addresses"`
}
if err := json.Unmarshal(data, &raw); err != nil {
return err
}
// 将单个字符串拆分为切片(根据需要的分隔符)
if raw.Ipv4Addresses != "" {
p.Ipv4Addresses = strings.Split(raw.Ipv4Addresses, ",")
} else {
p.Ipv4Addresses = []string{}
}
return nil
}
在这个示例中,我们手动处理了 Ipv4Addresses
字段,以便能够从 Redis 存储的字符串中创建切片。
最终步骤
根据你的具体需求选择合适的方法。如果可能,更改 Redis 存储方式通常更简单,因为它减少了后续代码复杂性。然而,如果现有数据结构不能轻易更改,自定义解析逻辑也是一个有效的方案。
内容由零声教学AI助手提供,问题来源于学员提问