126

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
4

6 回答 6

217

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
于 2012-11-06T09:22:46.480 回答
27

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

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]
}
于 2015-10-21T06:31:31.517 回答
6

另一个带有 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
于 2018-02-07T14:59:58.173 回答
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)

}

` 输出:

亚历克斯·史密斯住在麦克阿瑟大道 33 号

于 2021-07-07T22:36:19.113 回答
-2

这是处理此问题的简单方法:

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"
于 2021-03-31T15:23:51.477 回答
-7

我更喜欢以下内容:

type StringRef []byte

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

…

// rather silly example, but ...
fmt.Printf("foo=%s\n",StringRef("bar"))
于 2014-12-26T12:47:54.290 回答