go中的Stringer接口

任何语言里都有对输入输出的实现。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()方法。

Stringer is a type that can describe itself as a string. The fmt 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方法,而是打印出我们期望的字符串。

猜你喜欢

转载自blog.csdn.net/weixin_36094484/article/details/82222655
今日推荐