ToString() function in Go

GoTostring

Go Problem Overview


The strings.Join function takes slices of strings only:

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

But it would be nice to be able to pass arbitrary objects which implement a ToString() function.

type ToStringConverter interface {
	ToString() string
}

Is there something like this in Go or do I have to decorate existing types like int with ToString methods and write a wrapper around strings.Join?

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

Go Solutions


Solution 1 - Go

Attach a String() string method to any named type and enjoy any custom "ToString" functionality:

package main

import "fmt"

type bin int

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

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

Playground: http://play.golang.org/p/Azql7_pDAA


Output

101010

Solution 2 - Go

When you have own struct, you could have own convert-to-string function.

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

Solution 3 - Go

Another example with a struct :

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

Be careful when using it,
concatenation with '+' doesn't compile :

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

Solution 4 - Go

  • This works well

` package main

import "fmt"


type Person struct {
	fname, sname string 
	address string 
}


func (p *Person) String() string {
	s:=  fmt.Sprintf("\n %s %s  lives at %s \n", p.fname, p.sname, p.address)
	return s
}


func main(){
	alex := &Person{"Alex", "Smith", "33 McArthur Bvd"}
	fmt.Println(alex)

}

` Output:

Alex Smith lives at 33 McArthur Bvd

Solution 5 - Go

Here is a simple way to handle this:

package main

import (
	"fat"
	"strconv"
)

type Person struct {
	firstName, lastName string
	age int
}

func (p Person) GetFullName() string {
	return p.firstName + " " + p.lastName
}

func (p Person) GetAge() int {
	return p.age
}

func (p Person) GetAgeAsString() string {
	return strconv.Itoa(p.age)
}

func main() {
	p := Person {"John", "Doe", 21}
	fmt.Println(p.GetFullName())
	fmt.Println(p.GetAgeAsString())
}

Output:

"John Doe"
"21"

Solution 6 - Go

I prefer something like the following:

type StringRef []byte

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

…

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondeamonView Question on Stackoverflow
Solution 1 - GozzzzView Answer on Stackoverflow
Solution 2 - GoRioView Answer on Stackoverflow
Solution 3 - GolguView Answer on Stackoverflow
Solution 4 - GoGo_RunnerView Answer on Stackoverflow
Solution 5 - GoGary YavicoliView Answer on Stackoverflow
Solution 6 - GoJSSView Answer on Stackoverflow