Go में ToString () फ़ंक्शन


95

strings.Joinसमारोह केवल तार के स्लाइस लेता है:

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

लेकिन मनमानी वस्तुओं को पारित करने में सक्षम होना अच्छा होगा जो एक ToString()फ़ंक्शन को लागू करते हैं।

type ToStringConverter interface {
    ToString() string
}

क्या गो में ऐसा कुछ है या क्या मुझे मौजूदा प्रकारों को सजाना है जैसे intकि ToString तरीकों और चारों ओर एक आवरण लिखना strings.Join?

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

7
ध्यान दें कि ऐसा इंटरफ़ेस पहले से मौजूद है: golang.org/pkg/fmt/#Stringer
Denys Séguret


@ मैं इस डुप्लिकेट की आवश्यकता नहीं देखता। वर्तमान प्रश्न मेरी राय में पर्याप्त था और यह तथ्य कि कोई वास्तविक (या पूर्ण) उत्तर नहीं था, इसका मतलब यह नहीं है कि आपको फिर से पूछना होगा।
सेज्यूरेट

जवाबों:


182

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
आप सही हैं, हालांकि इसका उत्तर यह नहीं है कि रूपांतरण एकमात्र विकल्प है। बिंदु स्ट्रिंग () पद्धति में एक प्रकार से जुड़ा हुआ है। कहीं भी fmt। * इस विधि को इस प्रकार के स्ट्रिंग निरूपण को प्राप्त करने के लिए संलग्न करने के लिए इसका उपयोग करता है।
zzzz

2
bin(42).String()दूसरे उदाहरण के रूप में जोड़ना उत्तर के लिए बेहतर होगा।
आइलिमिस्ट

ध्यान दें: फिगंरॉन Error() stringकी तुलना में उच्च प्राथमिकता हैString() string
गेलन यांग

1
दूसरे शब्दों में, Stringerइंटरफ़ेस को लागू करें: golang.org/pkg/fmt/#Stringer
tothemario

17

जब आपके पास खुद होता है 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)करता है ( आमतौर पर) जो कि आमतौर पर करता है।
डेव सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.