2

我有一个 terratest ,我可以像这样从 terraform 获得输出s := "[a b]"。terraform 输出的value = toset([resource.name]),它是一组字符串。

显然fmt.Printf("%T", s)返回string。我需要迭代以执行进一步的验证。

我尝试了以下方法,但错误!

var v interface{}
if err := json.Unmarshal([]byte(s), &v); err != nil {
    fmt.Println(err)
}

我当前转换为切片的实现是:

s := "[a b]"
s1 := strings.Fields(strings.Trim(s, "[]"))
for _, v:= range s1 {
    fmt.Println("v -> " + v)
}

寻找当前方法的建议或转换为我应该考虑的 arr/slice 的替代方法。感谢任何输入。谢谢。

4

2 回答 2

3

实际上,您当前的实现似乎还不错。

您不能使用 JSON 解组,因为 JSON 字符串必须用双引号括起来"

相反strings.Fields,它只是将字符串拆分为一个或多个匹配的字符,unicode.IsSpace\t, \n, \v\f,\r .

Moeover 如果 terraform 发送一个空集 as [],这也有效,如文档中所述:

如果 s 仅包含空格,则返回 [...] 一个空切片。

...包括完全s为空的情况。""

如果您需要对此进行额外控制,您可以使用strings.FieldsFunc,它接受一个类型的函数,func(rune) bool这样您就可以自己确定什么构成了“空间”。但是由于您的输入字符串来自 terraform,我想它会表现得足够好。

可能有第三方包已经实现了这个功能,但是除非你的程序已经导入了它们,否则我认为基于标准库的原生解决方案总是更可取的。


unicode.IsSpace实际上还包括更高的符文0x850xA0,在这种情况下strings.Fields调用FieldsFunc(s, unicode.IsSpace)

于 2021-09-24T14:46:41.880 回答
0
package main

import (
    "fmt"
    "strings"
)

func main() {
    src := "[a b]"
    dst := strings.Split(src[1:len(src)-1], " ")
    fmt.Println(dst)
}

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

于 2021-09-24T14:48:03.800 回答