我是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)
我是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,泛型还没有被支持。标准库也没有提供这些类型操作(map、filter、reduce等)的内置函数。
对于这个简单的用例,你已经有了足够的东西。将其封装在一个函数中,就可以满足你的需求。在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()
。
以下是三个一行代码的例子,将一个 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)
[]
[]
[]
[]int8
、[]int32
、[]float32
等,甚至适用于数组,例如[4]int
...