我是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
值"转换"为其元素:
- 去掉前导方括号和尾随方括号
- 拆分(分隔)空格上的剩余文本
我们完成了。
对于第一步,我们有几个选择,例如strings.Replace()
、strings.Replacer
、strings.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
......