你想要的可以用一行来完成,但这些解决方案(在性能上)不如你在问题中提出的简单循环。所以这里有一些单行,但我可能永远不会使用它们来实现你想要的,所以只需使用 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("%q\n", sNums)
sNums2 := strings.Split(strings.Trim(fmt.Sprint(nums), "[]"), " ")
fmt.Printf("%q\n", sNums2)
sNums3 := strings.Split(strings.TrimRight(fmt.Sprint(nums)[1:], "]"), " ")
fmt.Printf("%q\n", 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("%q\n", sNums)
sNums2 := strings.SplitN(strings.Trim(fmt.Sprint(nums), "[]"), " ", len(nums))
fmt.Printf("%q\n", sNums2)
sNums3 := strings.SplitN(strings.TrimRight(fmt.Sprint(nums)[1:], "]"), " ", len(nums))
fmt.Printf("%q\n", sNums3)
这将正确输出(在Go Playground 上尝试):
[]
[]
[]
这里需要注意一点:所呈现的解决方案有点像通用的,因为这些解决方案适用于其他类型的切片,例如[]int8、[]int32、[]float32 等,即使是数组,例如[4]int...