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
答案 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"))