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 inpython
,您可以执行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