简体   繁体   English

如何在golang中将字符串从接口转换为[]字符串?

[英]How to convert string from interface to []string in golang?

I'm parsing a JSON object which contains an array of strings :我正在解析一个包含字符串数组的 JSON 对象:

var ii interface{}
json := "{\"aString\": [\"aaa_111\", \"bbb_222\"], \"whatever\":\"ccc\"}"

err := json.Unmarshal([]byte(json), &ii)
if err != nil {
    log.Fatal(err)
}
data := ii.(map[string]interface{})
fmt.Println(data["aString"]) // outputs: ["aaa_111" "bbb_222"]

I tried to convert data["aString"] to []string to be able to loop over it, but it fails :我试图将data["aString"]转换为 []string 以便能够遍历它,但它失败了:

 test := []string(data["aString"]).([]string)
 fmt.Println(test) // panic -> interface conversion: 
                   //          interface is string, not []string

How can I convert data["aString"] ?如何转换data["aString"]


edit:编辑:

I didn't express myself properly.我没有正确表达自己。 If I print data , I have such map :如果我打印data ,我有这样的地图:

map[aString:["BBB-222","AAA-111"] whatever:ccc]

I want to loop over aString (to manipule each array entry).我想遍历 aString (操作每个数组条目)。 But I can't find how, because aString is type interface {} :但我找不到方法,因为 aString 是type interface {}

for i, v := range aString { // <-- fails
     // ...
     fmt.Println(i, v)
}

That's why I want to convert aString.这就是我想转换 aString 的原因。 I don't want to convert a string which looks like an array to an array.我不想将看起来像数组的字符串转换为数组。

I recommend you move away from this implementation in general.我建议您总体上远离此实现。 Your json may vary but you can easily use objects and avoid all this type unsafe nonsense.您的 json 可能会有所不同,但您可以轻松使用对象并避免所有此类不安全的废话。

Anyway, that conversion doesn't work because the types inside the slice are not string , they're also interface{} .无论如何,这种转换不起作用,因为切片内的类型不是string ,它们也是interface{} You have to iterate the collection then do a type assertion on each item like so:您必须迭代集合,然后对每个项目进行类型断言,如下所示:

aInterface := data["aString"].([]interface{})
aString := make([]string, len(aInterface))
for i, v := range aInterface {
    aString[i] = v.(string)
}

Is it what you need?这是你需要的吗?

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    js := "{\"aString\": [\"aaa_111\", \"bbb_222\"], \"whatever\":\"ccc\"}"
    a := make(map[string]interface{})
    json.Unmarshal([]byte(js), &a)
    for _, v := range a["aString"].([]interface{}) {
        str := v.(string)
        fmt.Println(str)
    }
}

Check on Go Playground检查Go Playground

For another approach, you can use a struct instead:对于另一种方法,您可以改用struct

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   s := []byte(`{"aString": ["aaa_111", "bbb_222"], "whatever":"ccc"}`)
   var t struct {
      Astring []string
      Whatever string
   }
   json.Unmarshal(s, &t)
   fmt.Printf("%+v\n", t) // {Astring:[aaa_111 bbb_222] Whatever:ccc}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM