在一行中将 []int 转换为 golang 中的 [] 字符串



我是Go的初学者。只需几行即可将整数片段转换为字符串片段似乎很简单:

nums := []int{1, 2, 3, 4}
sNums := make([]string, len(nums))
for i, x := range nums {
sNums[i] = strconv.Itoa(x)
}

但是,我想知道是否有一种方法可以使用内置/标准库的快速单行代码来做到这一点,类似于 Python 中的以下内容:

sNums = map(str, nums)

您似乎正在寻找一个对切片进行操作的map函数。这将需要泛型,从Go 1.11开始,尚不支持泛型。标准库也不为这些类型的操作(映射、过滤、化简等)提供内置函数。

对于这个简单的用例,您已经拥有的东西已经足够了。将其包装在一个函数中,这将满足您的需求。在 Go 支持泛型之前,您必须对每种类型的切片进行手动写入操作。

一些阅读链接:

泛型提案

罗伯派克的过滤器库

你想要的可以用一行完成,但这些解决方案(在性能上)不如你在问题中提出的简单循环。所以这里有一些单行,但我可能永远不会使用它们来实现你想要的,所以只需使用for循环,如果你必须这样做很多次,创建一个帮助函数(将使用循环),然后只调用帮助函数。

以下单行代码都基于fmt.Sprint()函数构建,该函数为int切片生成字符串表示形式,如下所示(不带引号):

"[e1 e2 e3...]"

e1在哪里,e2...是输入切片的元素。

所以例如:

nums := []int{1, 2, -3, 4}
s := fmt.Sprint(nums)
fmt.Printf("%q", s)

将输出(在Go Playground上尝试):

"[1 2 -3 4]"

我们可以使用以下 2 个步骤将这个单一的string值"转换"为其元素:

  1. 去掉前导方括号和尾随方括号
  2. 拆分(分隔)空格上的剩余文本

我们完成了。

对于第一步,我们有几个选择,例如strings.Replace()strings.Replacerstrings.Trim()。我们可以通过切开字符串来"调味"修剪,以剪切其第一个字符(例如s[1:]) 因此,只需要删除尾随']'

对于第二步,我们有strings.Split().

如果没有所有可能的组合,这里有 3 个单行示例将int切片转换为string切片:

nums := []int{1, 2, -3, 4}
sNums := strings.Split(strings.Replace(fmt.Sprint(nums)[1:], "]", "", -1), " ")
fmt.Printf("%qn", sNums)
sNums2 := strings.Split(strings.Trim(fmt.Sprint(nums), "[]"), " ")
fmt.Printf("%qn", sNums2)
sNums3 := strings.Split(strings.TrimRight(fmt.Sprint(nums)[1:], "]"), " ")
fmt.Printf("%qn", sNums3)

以上输出(在Go Playground上尝试):

["1" "2" "-3" "4"]
["1" "2" "-3" "4"]
["1" "2" "-3" "4"]

有一种上述解决方案都不处理的边缘情况:如果输入是空切片,则输出将是包含空字符串的切片(当它应该是空切片时)。这样做的原因是,如果输入不包含空格分隔符(在本例中为空字符串),strings.Split()返回输入(这将是空字符串)。

为了处理空输入切片边缘情况,我们可以使用strings.SplitN()函数代替strings.Split(),传递len(nums)作为我们想要的最大零件数。因此,如果输入切片为空,则输出切片也将为空:

nums := []int{}
sNums := strings.SplitN(strings.Replace(fmt.Sprint(nums)[1:], "]", "", -1), " ", len(nums))
fmt.Printf("%qn", sNums)
sNums2 := strings.SplitN(strings.Trim(fmt.Sprint(nums), "[]"), " ", len(nums))
fmt.Printf("%qn", sNums2)
sNums3 := strings.SplitN(strings.TrimRight(fmt.Sprint(nums)[1:], "]"), " ", len(nums))
fmt.Printf("%qn", sNums3)

这将正确输出(在Go Playground上尝试):

[]
[]
[]

这里需要注意的一件事:所提出的解决方案有点像通用的,因为这些解决方案适用于其他类型的切片,例如[]int8[]int32[]float32等,即使有数组,例如[4]int......

最新更新