为了账号安全,请及时绑定邮箱和手机立即绑定

数组的字符串表示

数组的字符串表示

Go
开心每一天1111 2022-07-04 16:47:20
在以下代码中,该部分fmt.Println(string(a)+"\n")不起作用。有没有一种通用的方法来获取像数组这样的构造的字符串表示形式?package mainimport "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,我们可以在 python 中使用字符串表示str(obj),在 Java 中使用obj.toString(),我想找出 Go 中的对应物是什么。
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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


package main


import (

    "fmt"

    "strconv"

)


// type alias for [10]int

type istr [10]int


// istr implements fmt.Stringer interface

// String formats the integer array to a string array

func (a istr) String() string {

    var s string = "["

    for i := 0; i < 9; i++ {

        s += strconv.Itoa(a[i]) + " "

    }

    s += strconv.Itoa(a[9]) + "]"

    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 istr

    b[2] = 2

    fmt.Println("String Array")

    fmt.Println(b)

}

更新:


添加可以扩展更多类型的通用解决方案。目前,它可以将 rune/int/bool 的 slice 转换为 string。


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))

}


查看完整回答
反对 回复 2022-07-04
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

包的任何变量都会检查其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)

}

https://play.golang.org/p/lE5gnHXGGF4


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


同样通过阅读您的评论,我想添加 fmt 包知道如何格式化不同类型的数据,但有时您想制作输出字符串;是的,fmt 的输出是字符串,如果使用 Sprint、Sprintf 函数,您可以取回字符串


你可以在这里阅读更多关于它的信息 https://tour.golang.org/methods/17 https://golang.org/pkg/fmt/#Stringer


查看完整回答
反对 回复 2022-07-04
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号