单行将[] int转换为字符串

N0t*_*ing 38 go

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

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

蟒蛇:

> A = [1, 2, 3]
> ", ".join([str(a) for a in A])
'1, 2, 3'
Run Code Online (Sandbox Code Playgroud)

走:

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, ", "))
}
Run Code Online (Sandbox Code Playgroud)

当然必须有一个实用程序埋没,允许我用一个班轮做这个?

我知道有strings.Join(A, ", "),但只有在A已经是[]字符串时才有效.

小智 81

转换
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), "[]")
Run Code Online (Sandbox Code Playgroud)

要么:

strings.Trim(strings.Join(strings.Split(fmt.Sprint(A), " "), delim), "[]")
Run Code Online (Sandbox Code Playgroud)

要么:

strings.Trim(strings.Replace(fmt.Sprint(A), " ", delim, -1), "[]")
Run Code Online (Sandbox Code Playgroud)

并从一个函数返回它,例如在这个例子中:

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 从干净简单的```a.implode(',')``` 确实很好的回归:-/ (2认同)
  • 所有提议的解决方案都不必要地低效。 (2认同)
  • @yogesh_desai如果在热路径中使用此函数,则会看到很多不必要的分配。Go是明确的,并且大多数情况下不是Go风格的。当您弯腰惯用的Go规​​则时,不可避免地会在以后看到很多麻烦。 (2认同)

And*_*ssa 19

我今天遇到了同样的问题,因为我在标准库上找不到任何东西,我已经重新编译了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
}
Run Code Online (Sandbox Code Playgroud)

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

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, ",")
}
Run Code Online (Sandbox Code Playgroud)

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

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

根据实施情况,性能差异很大:

BenchmarkIntToString1-12         3000000           539 ns/op
BenchmarkIntToString2-12         5000000           359 ns/op
BenchmarkIntToString3-12         1000000          1162 ns/op
Run Code Online (Sandbox Code Playgroud)

就个人而言,我将使用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)
}
Run Code Online (Sandbox Code Playgroud)


Shi*_* Lv 6

您可以随时json.Marshal

data := []int{1,2,3}
s, _ := json.Marshal(data)
fmt.Println(string(s))
// output: [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)


Aki*_*oss 5

我相信您可以使用fmt.Sprint函数系列。我不是 go 格式化标志方面的专家,也许你可以只用一个 来完成它Sprintf,但这里有一个有效的单行代码:

data := []int{1,2,3}

func(x string) string { return x[6:len(x)-1]; }(fmt.Sprintf("%#v", data)) // 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

一般来说,您可以使用strings.Replace不同的分隔符(只要您可以安全地替换,默认分隔符):

// Produces 1--2--3
magic := func(s, d string) string { return strings.Replace(s[1:len(s)-1], " ", d, -1)  }
fmt.Println(magic(fmt.Sprint([]int{1, 2, 3}), "--"))

// As one liner
fmt.Println(func(s, d string) string { return strings.Replace(s[1:len(s)-1], " ", d, -1)  }(fmt.Sprint([]int{1, 2, 3}), "--"))
Run Code Online (Sandbox Code Playgroud)