Go中的ToString()函数

时间:2012-11-06 09:02:41

标签: go tostring

strings.Join函数仅接受字符串切片:

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

但能够传递实现ToString()函数的任意对象会很好。

type ToStringConverter interface {
    ToString() string
}

在Go中是否存在类似的内容,或者我是否必须使用ToString方法装饰int等现有类型并在strings.Join周围编写包装?

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

6 个答案:

答案 0 :(得分:137)

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 :(得分:12)

当您拥有自己的struct时,您可以拥有自己的转换为字符串功能。

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]
}

答案 2 :(得分:2)

结构的另一个例子:

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

答案 3 :(得分:0)

  • 效果很好

` 包主

import "fmt"


type Person struct {
    fname, sname string 
    address string 
}


func (p *Person) String() string {
    s:=  fmt.Sprintf("\n %s %s  lives at %s \n", p.fname, p.sname, p.address)
    return s
}


func main(){
    alex := &Person{"Alex", "Smith", "33 McArthur Bvd"}
    fmt.Println(alex)

}

` 输出:

Alex Smith 住在 33 McArthur Bvd

答案 4 :(得分:-1)

这里有一个简单的方法来处理这个:

package main

import (
    "fat"
    "strconv"
)

type Person struct {
    firstName, lastName string
    age int
}

func (p Person) GetFullName() string {
    return p.firstName + " " + p.lastName
}

func (p Person) GetAge() int {
    return p.age
}

func (p Person) GetAgeAsString() string {
    return strconv.Itoa(p.age)
}

func main() {
    p := Person {"John", "Doe", 21}
    fmt.Println(p.GetFullName())
    fmt.Println(p.GetAgeAsString())
}

输出:

"John Doe"
"21"

答案 5 :(得分:-7)

我更喜欢以下内容:

type StringRef []byte

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

…

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