Подтвердить что ты не робот

ToString() в Go

Функция 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
4b9b3361

Ответ 1

Прикрепите метод 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

Ответ 2

Когда у вас есть собственный 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]
}

Ответ 3

Я предпочитаю что-то вроде следующего:

type StringRef []byte

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

…

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