【问题标题】:How to convert the string representation of a Terraform set of strings to a slice of strings如何将 Terraform 字符串集的字符串表示形式转换为字符串切片
【发布时间】:2021-11-17 19:53:43
【问题描述】:

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

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

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

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 的替代方法。感谢任何输入。谢谢。

【问题讨论】:

    标签: go slice terratest


    【解决方案1】:

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

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

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

    如文档中所述,如果 terraform 将空集发送为 [],则此方法也有效:

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

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

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

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


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

    【讨论】:

      【解决方案2】:
      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

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • @Eric Lau 我遇到的strings.Split 的问题是,对于 terraform src := [] 的空输出,切片将 len(dst) 返回为 1。我真的不知道为什么,但很想学习背后的道理!人们请帮助我理解这种行为.. play.golang.org/p/lMRV-_Qy1wk
      • @codecorrect 这就是strings.Split 的工作方式。如果没有发生拆分,则返回一个切片,其中原始字符串仅作为 elem。
      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多