Go中的ToString()函数


95

strings.Join函数仅采用字符串切片:

s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))

但是能够传递实现ToString()函数的任意对象将是一个很好的选择。

type ToStringConverter interface {
    ToString() string
}

Go中是否有类似的东西,还是我必须int用ToString方法来修饰现有类型并编写一个包装器strings.Join

func Join(a []ToStringConverter, sep string) string

7
请注意,这样的接口已经存在:golang.org/pkg/fmt/#Stringer
丹尼斯·塞居勒


@daemon我看不到需要重复。在我看来,当前的问题已经很清楚了,没有真正(或完整)答案的事实并不意味着您必须再次提问。
DenysSéguret2012年

Answers:


182

String() string方法附加到任何命名类型,并享受任何自定义“ ToString”功能:

package main

import "fmt"

type bin int

func (b bin) String() string {
        return fmt.Sprintf("%b", b)
}

func main() {
        fmt.Println(bin(42))
}

游乐场:http//play.golang.org/p/Azql7_pDAA


输出量

101010

1
您是对的,尽管答案并不意味着转换是唯一的选择。该点位于附加到类型的String()方法中。在fmt。*的任何地方找到附加的方法,它都会使用它来获取这种类型的字符串表示。
zzzz 2012年

2
添加bin(42).String()另一个示例将更好地解决问题。
Thellimist

注意:functon的Error() string优先级比String() string
Geln Yang '18

1
换句话说,实现Stringer接口:golang.org/pkg/fmt/#Stringer
tothemario

17

当您拥有own时struct,您可以拥有自己的convert-to-string函数。

package main

import (
    "fmt"
)

type Color struct {
    Red   int `json:"red"`
    Green int `json:"green"`
    Blue  int `json:"blue"`
}

func (c Color) String() string {
    return fmt.Sprintf("[%d, %d, %d]", c.Red, c.Green, c.Blue)
}

func main() {
    c := Color{Red: 123, Green: 11, Blue: 34}
    fmt.Println(c) //[123, 11, 34]
}

4

另一个带有struct的示例:

package types

import "fmt"

type MyType struct {
    Id   int    
    Name string
}

func (t MyType) String() string {
    return fmt.Sprintf(
    "[%d : %s]",
    t.Id, 
    t.Name)
}

使用时要小心,
与'+'的连接 不能编译:

t := types.MyType{ 12, "Blabla" }

fmt.Println(t) // OK
fmt.Printf("t : %s \n", t) // OK
//fmt.Println("t : " + t) // Compiler error !!!
fmt.Println("t : " + t.String()) // OK if calling the function explicitly

-7

我更喜欢以下内容:

type StringRef []byte

func (s StringRef) String() string {
        return string(s[:])
}

…

// rather silly example, but ...
fmt.Printf("foo=%s\n",StringRef("bar"))

4
您不需要无用的:(即只是string(s))。另外,如果b[]bytestring(b)简单得多,然后你的StringRef(b).String()。最后,您的示例是毫无意义的,因为%s(与不同%v)已经将[]byte参数打印为字符串,而没有string(b)通常这样做的潜在副本。
Dave C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.