技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

stringer【Go】

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
}