ZBLOG

127.0.0.1:6379> hgetall nfprofile:NF_INSTANCE_ID_12222 1) "ipv4Addresses" 2) "192.168.1.1" json: cannot unmarshal string into Go struct field NfProfile.ipv4Addresses of type []string

你遇到的错误是因为在 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=7115

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?