如何将 Terraform 字符串集的字符串表示形式转换为字符串片段

How to convert the string representation of a Terraform set of strings to a slice of strings

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

显然 fmt.Printf("%T", s) returns 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 的替代方法。感谢任何输入。谢谢。

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

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

strings.Fields 就是这样做的,它将字符串拆分为一个或多个匹配 unicode.IsSpace 的字符,即 \t\n\v. \f\r

Moeover 如果 terraform 将空集发送为 [],这也适用,如文档中所述:

returning [...] an empty slice if s contains only white space.

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

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

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


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

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