fmtパッケージによるtype定義した型の出力内容を変更できる、interfaceです。
stringerのinterfaceは次のように定義されています。
type Stringer interface {
String() string
}
よって、String() stringを、変更したい型のメソッドに指定して、
編集した内容をreturnするだけです。
interfaceを特定するのに必要なのは「何をするか」、つまりメソッドだけだからです。
ビフォー・アフターで見てみましょう。
before :
type Person struct {
Name string
Age int
}
func main() {
mike := Person{"Mike", 21}
fmt.Println(mike) // {Mike 21} structそのものが出力される
}
after :
type Person struct {
Name string
Age int
}
func (p Person) String() string { // 中身を変更しないため、値レシーバーにしている。ポインタでも可
return "My name is " + p.Name
}
func main() {
mike := Person{"Mike", 21}
fmt.Println(mike) // My name is Mike stringerにより変更されている
}
type定義したものが対象ですので、次のようなこともできます。
type Int int
func (i Int) String() string {
return fmt.Sprintf("This type is %T, value:%d\n", i, i) // Sprintfによって、異なる型もまとめてstringにできる。%dは基数10の書式指定子
}
func main() {
num := Int(9)
fmt.Println(num) // This type is main.Int, value:9
}