Golang中如何从[]interface{}提取值

Golang中如何从[]interface{}提取值 大家好,

我正在学习Go语言,需要一些帮助。

我有一个变量 transformedEmail,打印出来时看起来像这样:

fmt.Printf("debug: %T, %v", transformedEmail, transformedEmail)

输出: debug: []interface {}, [map[encoded_value:.YlGhCqAs@gmail.com] map[encoded_value:+61-442-291-954] map[encoded_value:9872-5721-5683-2126] map[encoded_value:830-726 79679125]]%

我想遍历它并获取每个 "encoded_value" 的值,我应该怎么做?

谢谢

我有


更多关于Golang中如何从[]interface{}提取值的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

谢谢 @mje,这个方法有效!

更多关于Golang中如何从[]interface{}提取值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我尝试使用 transformedEmail[0],但遇到了以下错误:

invalid operation: cannot index transformedEmail (variable of type interface{})compilerNonIndexableOperand

你的 transformedEmail 必须被声明为 interface{} 类型。%T 告诉你它的动态类型是 []interface{}。使用类型断言来获取可以索引的切片变量。

  transformedEmailSlice,ok := transformedEmail.([]interface{})
  if !ok {
    log.Fatalf("transformedEmail is not really a []interface{}")
  }
  for i, element := range transformedEmailSlice {
    fmt.Printf("transformedEmail element %d: %T %v\n",i,element,element)
  }

你可以使用类型断言和循环来提取这些值。下面是一个示例代码:

package main

import "fmt"

func main() {
    // 假设这是你的数据
    transformedEmail := []interface{}{
        map[string]interface{}{"encoded_value": ".YlGhCqAs@gmail.com"},
        map[string]interface{}{"encoded_value": "+61-442-291-954"},
        map[string]interface{}{"encoded_value": "9872-5721-5683-2126"},
        map[string]interface{}{"encoded_value": "830-726 79679125"},
    }

    // 遍历切片
    for i, item := range transformedEmail {
        // 类型断言为 map[string]interface{}
        if m, ok := item.(map[string]interface{}); ok {
            // 获取 encoded_value 的值
            if value, exists := m["encoded_value"]; exists {
                // 再次类型断言为字符串
                if str, ok := value.(string); ok {
                    fmt.Printf("索引 %d: %s\n", i, str)
                }
            }
        }
    }
}

输出:

索引 0: .YlGhCqAs@gmail.com
索引 1: +61-442-291-954
索引 2: 9872-5721-5683-2126
索引 3: 830-726 79679125

如果你确定所有值都是字符串,可以简化代码:

for _, item := range transformedEmail {
    if m, ok := item.(map[string]interface{}); ok {
        fmt.Println(m["encoded_value"].(string))
    }
}

或者使用更安全的带检查的类型断言:

for _, item := range transformedEmail {
    if m, ok := item.(map[string]interface{}); ok {
        if value, ok := m["encoded_value"].(string); ok {
            fmt.Println(value)
        }
    }
}
回到顶部