Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 数组的字符串表示_Go - Fatal编程技术网

Go 数组的字符串表示

Go 数组的字符串表示,go,Go,在下面的代码中,fmt.Println(字符串(a)+“\n”)部分不起作用。有没有一种通用的方法来获取go中类似数组的结构的字符串表示形式 package main import "fmt" func main() { //Array of size 10 fmt.Println("Original array") var a [10]int fmt.Println(a) a[2] = 2 //wor

在下面的代码中,
fmt.Println(字符串(a)+“\n”)
部分不起作用。有没有一种通用的方法来获取go中类似数组的结构的字符串表示形式

package main

import "fmt"

func main() {
    //Array of size 10
    fmt.Println("Original array")
    var a [10]int
    fmt.Println(a)
    a[2] = 2

    //worked
    fmt.Printf("%v\n\n", a)

    //not working - anyway to get string representation of a?
    fmt.Println(string(a)+"\n")

}

更精确地说,给定一个对象
obj
,我们可以使用
str(obj)
在python中获得字符串表示,在Java中使用
obj.toString()
,我想知道Go中的对应项是什么。

我希望这是您想要的。我也对代码进行了注释,以便您能够理解

主程序包
进口(
“fmt”
“strconv”
)
//输入[10]int的别名
类型istr[10]int
//istr实现fmt.Stringer接口
//字符串将整数数组格式化为字符串数组
func(istr)String()字符串{
var s string=“[”
对于i:=0;i<9;i++{
s+=strconv.Itoa(a[i])+“”
}
s+=strconv.Itoa(a[9])+“]”
返回s
}
func main(){
//原创的
变量a[10]int
fmt.Println(“原始数组”)
fmt.Println(a)
//修改
a[2]=2
fmt.Println(“修改数组”)
fmt.Println(a)
//期望
var b istr
b[2]=2
fmt.Println(“字符串数组”)
fmt.Println(b)
}
更新:

添加一个可以扩展到更多类型的通用解决方案。目前,它可以将符文/int/bool的片段转换为字符串

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func ToString(iv interface{}) string {
    var sb strings.Builder
    switch iv := iv.(type) {
    case []int:
        var length = len(iv)
        if length == 0 {
            return "[]"
        }
        sb.WriteRune('[')
        for i := 0; i < length-1; i++ {
            sb.WriteString(strconv.Itoa(iv[i]))
            sb.WriteRune(' ')
        }
        sb.WriteString(strconv.Itoa(iv[length-1]))
        sb.WriteRune(']')
    case []bool:
        var length = len(iv)
        if length == 0 {
            return "[]"
        }
        sb.WriteRune('[')
        for i := 0; i < length-1; i++ {
            sb.WriteString(strconv.FormatBool(iv[i]))
            sb.WriteRune(' ')
        }
        sb.WriteString(strconv.FormatBool(iv[length-1]))
        sb.WriteRune(']')
    case []rune:
        var length = len(iv)
        if length == 0 {
            return "[]"
        }
        sb.WriteRune('[')
        for i := 0; i < length-1; i++ {
            sb.WriteRune(iv[i])
            sb.WriteRune(' ')
        }
        sb.WriteRune(iv[length-1])
        sb.WriteRune(']')
    }
    return sb.String()
}

func main() {
    // Original
    var a []int = make([]int, 10)
    fmt.Println("Original Slice")
    fmt.Println(a)

    // Modified
    a[2] = 2
    fmt.Println("Modified Slice")
    fmt.Println(a)

    // String
    fmt.Println("String Slice")
    fmt.Println(ToString(a))

    // Boolean
    fmt.Println("Boolean Slice")
    var b []bool = make([]bool, 10)
    b[2] = true
    fmt.Println(ToString(b))

    fmt.Println("Rune Slice")
    var r []rune = make([]rune, 10)
    r[0] = 'a'
    r[1] = 'c'
    fmt.Println(ToString(r))
}
主程序包
进口(
“fmt”
“strconv”
“字符串”
)
func ToString(iv接口{})字符串{
var.sb.Builder
开关iv:=iv(类型){
案例[]int:
变量长度=len(iv)
如果长度==0{
返回“[]”
}
某人的笔迹(“[”)
对于i:=0;i
您好,您要找的是
fmt
包中的
Stringer
接口

因此,在打印之前传递给
fmt
包的任何变量都会检查
Stringer
接口的实现。如果它实现了
Stringer
接口,它将自动隐式调用String函数

package main

import (
    "fmt"
)

// type alias for [10]int
type StringerIntArray [10]int

// String formats the StringerIntArray ([10]int) to a string
func (a StringerIntArray) String() string {
    var s string = "My Array is: "
    for i := 0; i < 9; i++ {
        s += fmt.Sprint(a[i]," ")
    }
    s = s[:len(s)-1]
    s+=" With Length:"+fmt.Sprint(len(a))
    return s
}

func main() {
    // Original
    var a [10]int
    fmt.Println("Original Array")
    fmt.Println(a)

    // Modified
    a[2] = 2
    fmt.Println("Modified Array")
    fmt.Println(a)

    // Expected
    var b StringerIntArray 
    b[2] = 2
    fmt.Println("String Array")
    fmt.Println(b)
}
主程序包
进口(
“fmt”
)
//输入[10]int的别名
类型stringerntarray[10]int
//String将StringerIntArray([10]int)格式化为字符串
func(字符串数组)String()字符串{
var s string=“我的数组是:”
对于i:=0;i<9;i++{
s+=fmt.Sprint(a[i],“”)
}
s=s[:len(s)-1]
长度为“+fmt.Sprint(len(a))
返回s
}
func main(){
//原创的
变量a[10]int
fmt.Println(“原始数组”)
fmt.Println(a)
//修改
a[2]=2
fmt.Println(“修改数组”)
fmt.Println(a)
//期望
星状病毒b型
b[2]=2
fmt.Println(“字符串数组”)
fmt.Println(b)
}

内置类型定义了默认的字符串格式;如果需要修改,则必须创建自定义类型并附加字符串函数

另外,通过阅读您的评论,我想补充一点,fmt包知道如何格式化不同类型的数据,但有时您希望生成输出字符串;是的,fmt的输出是字符串,如果您使用Sprint、Sprintf函数,您可以取回字符串

你可以在这里了解更多

您是否在寻找与
fmt.Printf(“%v”,a)
提供的不同的表示形式?或者您只是想让打印到控制台的内容以
fmt.Printf
字符串形式返回吗?@William您希望得到什么输出?@PaSTE in
python
,您可以执行
str(…)
,在
java
中,您可以执行
toString()
来获得字符串表示,我想在go中找到对应的。@william007要完整解释为什么
string(a)
不起作用,你可以读下去。谢谢,所以没有内置的方法将它转换为字符串,我们需要编写一个新的对象,显式地将string()函数附加到它?不完全是这样。为此,我使用了interface(阅读Go中的interface)。它肯定可以用更通用的方式编写。但是我不认为有任何内置的东西可以做到这一点。@william007我添加了一个可以扩展的通用(rune,int,bool)示例。我希望有帮助!很好的字符串函数实现似乎没有人提到这一点,但您可以简单地将任何对象转换为字符串,使用
fmt.Sprintf(“%v”,obj)
,或
fmt.Sprint(obj)
,Stringer接口为您提供了更多的控制,但是如果您只想打印一件东西/捕获字符串,真的没有理由这么做length@DavidBudworth我在这里提到过“是的,fmt的输出是字符串,你可以得到字符串b