如何将类型为 interface{} 的变量转换为数组(array)?

huangapple go评论121阅读模式
英文:

golang : how to convert type interface {} to array

问题

我有一个包含对象的 JSON 数组存储在 Redis 中,我想要遍历它,但是当我获取数据时,类型是 interface{},所以无法使用 range 遍历 interface{} 类型。

array := redis.Do(ctx, "JSON.GET", "key")

arrayResult, e := array.Result()

if e != nil {
    log.Printf("无法使用命令获取 JSON 数据 %s", e)
}

for _, i := range arrayResult {
    fmt.Printf(i)
}
英文:

I have a JSON array with objects in Redis that I want to loop through it, but when I fetch the data, the type is interface{}, so I cannot range over type interface{}

array := redis.Do(ctx, "JSON.GET", "key")

arrayResult, e := array.Result()

if e != nil {
    log.Printf("could not get json with command  %s", e)
}

for _, i := range arrayResult {
    fmt.Printf(i)
}

答案1

得分: 0

我相信你应该能够这样做:

for _, i := range arrayResult.([]byte) {
    // 在这里进行操作
}
英文:

I believe you should be able to do

for _, i := range arrayResult.([]byte) {
// do work here
}

答案2

得分: 0

谢谢大家,我找到了一个解决方案。首先,我需要将arrayResult转换为字节。然后,我将其解组为一个结构体,这样我就可以对其进行遍历。

array := redis.Do(ctx, "JSON.GET", "key")
arrayResult, e := array.Result()
if e != nil {
    log.Printf("无法使用命令获取JSON %s", e)
}

byteKey := []byte(fmt.Sprintf("%v", arrayResult.(interface{})))
RedisResult := struct{}
errUnmarshalRedisResult := json.Unmarshal(byteKey, &RedisResult)
if errUnmarshalRedisResult != nil {
    log.Printf("无法解组消息 %s", errUnmarshalRedisResult)
}

for _, i := range RedisResult {
    fmt.Printf(i)
}

希望对你有帮助!

英文:

Thank you guys, I found a solution. so at first I needed to convert the arrayResult to byte. Then I unmarshal it into a strcut, so now I am able to range over it.

array := redis.Do(ctx, "JSON.GET", "key")
arrayResult, e := array.Result()
if e != nil {
   log.Printf("could not get json with command  %s", e)
}

byteKey := []byte(fmt.Sprintf("%v", arrayResult.(interface{})))
RedisResult := struct{}
errUnmarshalRedisResult := json.Unmarshal(byteKey, &RedisResult)
if errUnmarshalRedisResult != nil {
   	log.Printf("cannot Unmarshal msg %s", errUnmarshalRedisResult)
}

for _, i := range RedisResult {
   fmt.Printf(i)
} 

huangapple
  • 本文由 发表于 2022年8月25日 05:41:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/73479775.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定