一行将golang中的[] int转换为[] string

时间:2018-12-10 01:04:47

标签: string go slice

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

2 个答案:

答案 0 :(得分:0)

似乎您正在寻找对分片运行的map函数。这将需要泛型,并且从Go 1.11开始,尚不支持泛型。标准库也没有为这些类型的操作(映射,过滤,缩小等)提供内置功能。<​​/ p>

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

一些阅读链接:

Generics Proposal

Rob Pike's Filter Library

答案 1 :(得分:0)

您想要的 可以单行完成,但是这些解决方案(在性能上)不如您在问题中提出的简单循环。因此,这里出现了一些单行代码,但是我可能永远不会使用它们来实现所需的功能,因此只需使用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]"

我们可以通过两个步骤将单个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("%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 ...