GoのToString()関数


92

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

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

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

type ToStringConverter interface {
    ToString() string
}

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

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

7
そのようなインターフェースがすでに存在していることに注意してください:golang.org/pkg/fmt/#Stringer
DenysSéguret12年


@daemonこの複製の必要性はわかりません。現在の質問は私の意見では十分に明確であり、実際の(または完全な)回答がなかったという事実は、もう一度質問する必要があることを意味しません。
DenysSéguret12年

回答:


178

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

1
答えは、変換が唯一の選択肢であることを意味するものではありませんが、そうです。ポイントは、型に関連付けられたString()メソッドにあります。どこでもfmt。*は、アタッチされたメソッドを見つけ、それを使用してそのようなタイプの文字列表現を取得します。
zzzz

2
bin(42).String()別の例として追加すると、答えが良くなります。
Thellimist

注:functonのError() string優先度はString() string
Geln Yangの

1
つまり、次のStringerインターフェイスを実装します。golang.org
pkg

16

を所有している場合は、独自の文字列変換関数を使用structできます。

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

4

構造体の別の例:

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

-7

私は次のようなものが好きです:

type StringRef []byte

func (s StringRef) String() string {
        return string(s[:])
}



// rather silly example, but ...
fmt.Printf("foo=%s\n",StringRef("bar"))

4
役に立たない:(つまり、単にstring(s))は必要ありません。また、もしbある[]byteその後、string(b)はるかに簡単してからStringRef(b).String()。最後に、通常のように潜在的なコピーがない場合、%s(とは異なり%v)すでに[]byte引数を文字列として出力するため、この例は無意味string(b)です。
Dave C、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.