golang将接口数组转换为字符串

use*_*383 3 json interface decoding go

我从远程源读取JSON数据并将其转换为地图.我想要检查字符串值的数据中有一些数组.转换后我认为m ["t"]是一个接口数组.fmt.Print将其转换为控制台上的打印文本,但我无法想办法进行简单的字符串比较

if val[0] == "str-c" {fmt.Println("success")}
Run Code Online (Sandbox Code Playgroud)

我如何迭代并进行字符串比较?

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    var m map[string]interface{}
    sJSON := `{"k": "v", "t":["str-a","str-b","str-c"]}`
    _ = json.Unmarshal([]byte(sJSON),&m)

    // find out if one of the string values of "t" is "str-b"
    fmt.Println(m["t"]) 
}
Run Code Online (Sandbox Code Playgroud)

eva*_*nal 7

m["t"]是类型interface{}并且是完整的数组,如果你想得到str-b它是在索引1,你必须做一些类型断言来把它作为一个字符串.这是一个例子; https://play.golang.org/p/W7ZnMgicc7

如果你想在集合中检查它,看起来像这样;

包主

import (
    "fmt"
    "encoding/json"
)

func main() {
    var m map[string]interface{}
    sJSON := `{"k": "v", "t":["str-a","str-b","str-c"]}`
    _ = json.Unmarshal([]byte(sJSON),&m)

    // find out if one of the string values of "t" is "str-b"
    for _, v := range m["t"].([]interface{}) {
         if v.(string) == "str-b" {
              fmt.Println("match found!")
         }
    }
    //fmt.Println(m["t"].([]interface{})[1].(string)) 
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/vo_90bKw92

如果你想避免这种"拆箱"的东西,我建议你这样做,你可以改为定义一个解组的结构,它看起来像这样;

type MyStruct struct {
     K string `json:"k"`
     T []string `json:"t"`
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在T没有任何类型断言的情况下进行范围扩展,并在这里进行比较,工作示例; https://play.golang.org/p/ehPxOygGf5