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

时间:2016-05-30 19:07:18

标签: go

基本上我有#include<iostream> using namespace std; class Figura{ public: int x; int y; virtual void pomak(int dx=10,int dy=1) { x+=dx; y+=dy; cout<<"Figura"<<endl; } }; class Skakac:public Figura{ public: void pomak(int dx=2,int dy=-1) { cout<<dx<<endl; x+=dx; y+=dy; cout<<"Skakac"<<endl; } }; int main() { Skakac S; S.x=0; S.y=0; Figura* x=&S; cout<<x->x<<" "<<x->y<<endl; x->pomak(); cout<<S.x<<" "<<S.y<<endl; } ,我想要一个单行程序将其转换为字符串“1,2,3”(我需要定制分隔符,有时[]int{1, 2, 3},有时{{} 1}}等。以下是我能想到的最好的。在网上搜索,似乎没有找到更好的答案。

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

蟒:

.

转到:

,

当然必须有一个实用工具可以让我用一个班轮来做这件事吗?

我知道有> A = [1, 2, 3] > ", ".join([str(a) for a in A]) '1, 2, 3' ,但只有在A已经是[]字符串时才有效。

4 个答案:

答案 0 :(得分:71)

转换为 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), "[]")以强制在分隔符后插入。

答案 1 :(得分:16)

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

返回一个连接的字符串
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)
}

答案 2 :(得分:6)

您可以随时json.Marshal

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

答案 3 :(得分:4)

我相信你可以使用fmt.Sprint系列功能。我不是格式化标志的专家,也许你可以只使用Sprintf制作它,但这里有一个有效的单行:

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

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

通常,您可以使用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}), "--"))