我是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)
答案 0 :(得分:0)
似乎您正在寻找对分片运行的map
函数。这将需要泛型,并且从Go 1.11开始,尚不支持泛型。标准库也没有为这些类型的操作(映射,过滤,缩小等)提供内置功能。</ p>
对于这个简单的用例,您已经拥有的足够。将其包装在一个函数中,它将满足您的需求。在Go支持泛型之前,您必须对每种切片类型进行手写操作。
一些阅读链接:
答案 1 :(得分:0)
您想要的 可以单行完成,但是这些解决方案(在性能上)不如您在问题中提出的简单循环。因此,这里出现了一些单行代码,但是我可能永远不会使用它们来实现所需的功能,因此只需使用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]"
我们可以通过两个步骤将单个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
...