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
Join
функции, которая принимаетStringer
объектыОтветы:
Прикрепите
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
источник
bin(42).String()
качестве другого примера будет лучше для ответа.Error() string
имеет более высокий приоритет, чемString() string
Stringer
интерфейс: golang.org/pkg/fmt/#StringerКогда у вас есть собственный
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] }
источник
Другой пример со структурой:
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
источник
Я предпочитаю что-то вроде следующего:
type StringRef []byte func (s StringRef) String() string { return string(s[:]) } … // rather silly example, but ... fmt.Printf("foo=%s\n",StringRef("bar"))
источник
:
(т.е. простоstring(s)
). Кроме того , еслиb
есть ,[]byte
тоstring(b)
гораздо проще , и тогда вашStringRef(b).String()
. Наконец, ваш пример бессмыслен, поскольку%s
(в отличие от%v
) уже печатает[]byte
аргументы в виде строк без потенциальной копии, котораяstring(b)
обычно это делает.