ToString () ฟังก์ชันใน Go


96

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

7
โปรดทราบว่าอินเทอร์เฟซดังกล่าวมีอยู่แล้ว: golang.org/pkg/fmt/#Stringer
Denys Séguret


@daemon ฉันไม่เห็นความจำเป็นในการทำซ้ำนี้ คำถามปัจจุบันมีความชัดเจนเพียงพอในความคิดของฉันและความจริงที่ว่าไม่มีคำตอบที่แท้จริง (หรือสมบูรณ์) ไม่ได้หมายความว่าคุณต้องถามอีกครั้ง
Denys Séguret

คำตอบ:


183

แนบ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/fmt/#Stringer
tothemario

18

เมื่อคุณมีเอง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.