Go'da ToString () işlevi


96

strings.Joinİşlevi yalnızca dizeleri dilimleri alır:

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

Ancak, bir ToString()işlevi uygulayan rastgele nesneleri geçirebilmek güzel olurdu .

type ToStringConverter interface {
    ToString() string
}

Go'da buna benzer bir şey var mı yoksa intToString yöntemlerinde olduğu gibi mevcut türleri süsleyip etrafına bir sarmalayıcı yazmam strings.Joinmı gerekiyor?

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

7
Böyle bir arayüzün zaten mevcut olduğuna dikkat edin
Denys Séguret


@daemon Bu kopyaya gerek görmüyorum. Bence mevcut soru yeterince açıktı ve gerçek (veya tam) bir yanıtın olmaması, tekrar sormanız gerektiği anlamına gelmez.
Denys Séguret

Yanıtlar:


183

String() stringHerhangi bir adlandırılmış türe bir yöntem ekleyin ve herhangi bir özel "ToString" işlevinin keyfini çıkarın:

package main

import "fmt"

type bin int

func (b bin) String() string {
        return fmt.Sprintf("%b", b)
}

func main() {
        fmt.Println(bin(42))
}

Oyun alanı: http://play.golang.org/p/Azql7_pDAA


Çıktı

101010

1
Haklısın, ancak yanıt, dönüşümün tek seçenek olduğu anlamına gelmiyor. Nokta, bir türe eklenmiş String () yöntemindedir. Her yerde fmt. *, Eklenen yöntemin, bu türden dize temsilini elde etmek için kullandığını bulur.
zzzz

2
bin(42).String()başka bir örnek olarak eklemek cevap için daha iyi olacaktır.
Thellimist

NOT: Error() stringString() string
functon

1
Başka bir deyişle, Stringerarayüzü uygulayın: golang.org/pkg/fmt/#Stringer
tothemario

18

Sahibi olan zaman struct, sen kendi olabilir convert-to-dize işlevini.

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

Bir yapıya sahip başka bir örnek:

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

Kullanırken dikkatli olun,
'+' ile birleştirme derlemez:

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

Aşağıdaki gibi bir şeyi tercih ederim:

type StringRef []byte

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

…

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

4
Yararsıza ihtiyacınız yok :(yani sadece string(s)) Ayrıca, eğer bo []bytezaman string(b)çok daha basit ve sonra sizin StringRef(b).String(). Son olarak, örneğiniz anlamsızdır çünkü %s(aksine %v) []byteargümanları string(b)genellikle potansiyel kopya olmadan dizeler olarak yazdırır .
Dave C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.