将 \[\]int 转换为字符串的一行代码

新手上路,请多包涵

基本上我有 []int{1, 2, 3} ,我想要一个将其转换为字符串 “1, 2, 3” 的单行代码(我需要自定义分隔符,有时 . ,有时 , 等)。以下是我能想到的最好的。在网上搜索了一下,似乎没有找到更好的答案。

在大多数语言中都有对此的内置支持,例如:

Python:

 > A = [1, 2, 3]
> ", ".join([str(a) for a in A])
'1, 2, 3'

去:

 package main

import (
    "bytes"
    "fmt"
    "strconv"
)

// Could not find a one-liner that does this :(.
func arrayToString(A []int, delim string) string {

    var buffer bytes.Buffer
    for i := 0; i < len(A); i++ {
        buffer.WriteString(strconv.Itoa(A[i]))
        if i != len(A)-1 {
            buffer.WriteString(delim)
        }
    }

    return buffer.String()
}

func main() {
    A := []int{1, 2, 3}
    fmt.Println(arrayToString(A, ", "))
}

go 中肯定有一个实用程序可以让我用单行代码来完成这项工作吗?

我知道有 strings.Join(A, ", ") ,但这只有在 A 已经是 []string 时才有效。

原文由 N0thing 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 457
2 个回答

转换

A := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

到一行分隔的字符串,如

“1,2,3,4,5,6,7,8,9”

利用:

 strings.Trim(strings.Join(strings.Fields(fmt.Sprint(A)), delim), "[]")

或者:

 strings.Trim(strings.Join(strings.Split(fmt.Sprint(A), " "), delim), "[]")

或者:

 strings.Trim(strings.Replace(fmt.Sprint(A), " ", delim, -1), "[]")

并从这个例子中的函数返回它:

 package main

import "fmt"
import "strings"

func arrayToString(a []int, delim string) string {
    return strings.Trim(strings.Replace(fmt.Sprint(a), " ", delim, -1), "[]")
    //return strings.Trim(strings.Join(strings.Split(fmt.Sprint(a), " "), delim), "[]")
    //return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(a)), delim), "[]")
}

func main() {
    A := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

    fmt.Println(arrayToString(A, ",")) //1,2,3,4,5,6,7,8,9
}

要在逗号后包含一个空格,您可以调用 arrayToString(A, ", ") 或相反将返回定义为 return strings.Trim(strings.Replace(fmt.Sprint(a), " ", delim + " ", -1), "[]") 以强制将其插入到分隔符之后。

原文由 user6169399 发布,翻译遵循 CC BY-SA 3.0 许可协议

我今天遇到了同样的问题,因为我在标准库中没有找到任何东西,我重新编译了3种方法来进行这种转换

创建一个字符串并通过使用 strconv.Itoa 转换它来附加数组中的值:

 func IntToString1() string {
    a := []int{1, 2, 3, 4, 5}
    b := ""
    for _, v := range a {
        if len(b) > 0 {
            b += ","
        }
        b += strconv.Itoa(v)
    }

    return b
}

创建一个 []string,转换每个数组值,然后从 []string 返回一个连接的字符串:

 func IntToString2() string {
    a := []int{1, 2, 3, 4, 5}
    b := make([]string, len(a))
    for i, v := range a {
        b[i] = strconv.Itoa(v)
    }

    return strings.Join(b, ",")
}

将 []int 转换为字符串并替换/修剪值:

 func IntToString3() string {
    a := []int{1, 2, 3, 4, 5}
    return strings.Trim(strings.Replace(fmt.Sprint(a), " ", ",", -1), "[]")
}

性能因实施而异:

 BenchmarkIntToString1-12         3000000           539 ns/op
BenchmarkIntToString2-12         5000000           359 ns/op
BenchmarkIntToString3-12         1000000          1162 ns/op

就我个人而言,我将使用 IntToString2,因此最终函数可能是我项目中的一个 util 包,如下所示:

 func SplitToString(a []int, sep string) string {
    if len(a) == 0 {
        return ""
    }

    b := make([]string, len(a))
    for i, v := range a {
        b[i] = strconv.Itoa(v)
    }
    return strings.Join(b, sep)
}

原文由 Andrea Sessa 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题