任何语言里都有对输入输出的实现。go中提供了fmt包帮我们格式化输出字符串,其中最常用的是fmt.Printf和fmt.Println。
fmt.Printf和c语言的printf类似:
fmt.Printf("%v: %v\n", name, ip)
fmt.Println是单纯将参数字符串化然后输出断行:
fmt.Println(a, z)
但实际上,fmt在调用Printf或Println的时候,会对传入的参数对象查询并调用一个Stringer接口。这个Stringer接口有个String() 方法返回一个描述实例自身的字符串。但实际上,只要参数的类型实现了String()方法即可。
ps:其实就类似于js中默认调用定义在Object原型的toString()方法。
A
Stringer
is a type that can describe itself as a string. Thefmt
package (and many others) look for this interface to print values.
看实例:
package main
import "fmt"
//定义Poeple类型并实现String方法
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%v (%v years)\n", p.Name, p.Age)
}
//定义Sb类型并实现String方法
type Sb struct {
Name string
Age int
}
func (a Sb) String() string {
// return fmt.Sprintf("%v %v years", a.Name, a.Age)
return fmt.Sprint("sb")
}
func main() {
a := Person{"A D", 18}
z := Sb{"Z B", 16}
fmt.Println(a, z)
}
//输出:
A D (18 years)
sb
上边代码中我们给Person和Sb显式定义了String方法,所以fmt就不调用默认的String方法,而是打印出我们期望的字符串。