web-dev-qa-db-ja.com

GoのToString()関数

strings.Join関数は、文字列のスライスのみを受け取ります。

s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))

しかし、ToString()関数を実装する任意のオブジェクトを渡すことができると便利です。

type ToStringConverter interface {
    ToString() string
}

Goにこのようなものがありますか、またはintなどの既存の型をToStringメソッドで装飾し、strings.Joinの周りにラッパーを記述する必要がありますか?

func Join(a []ToStringConverter, sep string) string
74
deamon

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
143
zzzz

独自のstructがある場合、独自のconvert-to-string関数を持つことができます。

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]
}
12
Rio

構造体の別の例:

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
2
lgu