Hàm ToString () trong Go


95

Các strings.Joinchức năng mất lát chỉ chuỗi:

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

Nhưng sẽ rất tuyệt nếu có thể truyền các đối tượng tùy ý triển khai một ToString()hàm.

type ToStringConverter interface {
    ToString() string
}

Có điều gì đó giống như thế này trong Go hay tôi phải trang trí các kiểu hiện có như intvới các phương thức ToString và viết một trình bao bọc xung quanh strings.Join?

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

7
Lưu ý rằng một giao diện như vậy đã tồn tại: golang.org/pkg/fmt/#Stringer
Denys SEGURET


@daemon Tôi không thấy cần phải có bản sao này. Theo ý kiến ​​của tôi, câu hỏi hiện tại đã đủ rõ ràng và thực tế là không có câu trả lời thực sự (hoặc đầy đủ) không có nghĩa là bạn phải hỏi lại.
Denys Séguret

Câu trả lời:


182

Đính kèm một String() stringphương thức vào bất kỳ loại được đặt tên nào và tận hưởng bất kỳ chức năng "ToString" tùy chỉnh nào:

package main

import "fmt"

type bin int

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

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

Sân chơi: http://play.golang.org/p/Azql7_pDAA


Đầu ra

101010

1
Bạn đúng, mặc dù câu trả lời không ngụ ý rằng chuyển đổi là lựa chọn duy nhất. Điểm nằm trong phương thức String () được gắn với một kiểu. Ở bất kỳ đâu fmt. * Tìm thấy phương thức đó được đính kèm, nó sử dụng nó để lấy biểu diễn chuỗi của kiểu như vậy.
zzzz

2
thêm vào bin(42).String()như một ví dụ khác sẽ tốt hơn cho câu trả lời.
Thellimist

LƯU Ý: functon Error() stringcó ưu tiên cao hơnString() string
Geln Yang

1
Nói cách khác, hãy triển khai Stringergiao diện: golang.org/pkg/fmt/#Stringer
tothemario

18

Khi bạn có riêng struct, bạn có thể có hàm chuyển đổi thành chuỗi riêng .

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

Một ví dụ khác với cấu trúc:

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

Hãy cẩn thận khi sử dụng nó,
nối với '+' không biên dịch:

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

Tôi thích một cái gì đó như sau:

type StringRef []byte

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

…

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

4
Bạn không cần những thứ vô dụng :, (tức là chỉ string(s)). Ngoài ra, nếu b[]bytesau đó string(b)đơn giản hơn nhiều và sau đó bạn StringRef(b).String(). Cuối cùng, ví dụ của bạn là vô nghĩa vì %s(không giống như %v) đã in các []byteđối số dưới dạng chuỗi mà không có bản sao tiềm năng string(b)thường làm.
Dave C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.