在golang中一行代码将[]int转换为[]string

3

我是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)

5
这是使用标准库中可用的函数编写的最短代码。 - Charlie Tumahai
1
Go语言不喜欢“快速一行代码”。Go采取的方法是永远不隐藏复杂性,因此在Go中使用显式的for循环是正确的方法。 - Jonathan Hall
你可以将那段代码放进一个函数中,然后将其作为一行调用。在Go语言中,函数的开销很小。 - Vorsprung
2个回答

1

看起来你正在寻找一个可以操作切片的map函数。这需要泛型,但是截至Go 1.11,泛型还没有被支持。标准库也没有提供这些类型操作(map、filter、reduce等)的内置函数。

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

一些阅读链接:

泛型提案

Rob Pike的Filter库


1

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

以下一行代码都建立在 fmt.Sprint() 函数之上,该函数为int切片生成字符串表示形式,例如(不包含引号):

"[e1 e2 e3...]"

e1e2... 是输入切片的元素。

例如:

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.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)

这将正确输出(在Go Playground上尝试一下):
[]
[]
[]

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接