Percursos
/
Go
Go
/
Programa
/
Stringers
St

Stringers em Go

1 exercício

Sobre Stringers

Stringer é uma interface para definir o formato de string dos valores.

A interface consiste num único método String:

type Stringer interface {
    String() string
}

Os tipos que querem implementar esta interface têm de ter um método String() que devolve uma representação em string do tipo, amigável para humanos. O pacote fmt (e muitos outros) procuram este método para formatar e imprimir valores.

Exemplo: Distâncias

Suponhamos que estamos a trabalhar numa aplicação que lida com distâncias geográficas medidas em unidades diferentes. Definimos os tipos DistanceUnit e Distance da seguinte forma:

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

No exemplo acima, Kilometer e Mile são constantes do tipo DistanceUnit.

Estes tipos não implementam a interface Stringer, uma vez que não têm o método String. Assim, as funções fmt imprimem valores Distance usando o «formato predefinido» do Go:

mileUnit := Mile
fmt.Sprint(mileUnit)
// => 1
// The result is '1' because that is the underlying value of the 'Mile' constant (see constant declarations above)

dist := Distance{number: 790.7, unit: Kilometer}
fmt.Sprint(dist)
// => {790.7 0}
// not a very useful output!

Para tornar a saída mais informativa, implementamos a interface Stringer para os tipos DistanceUnit e Distance, adicionando um método String a cada tipo:

func (sc DistanceUnit) String() string {
	units := []string{"km", "mi"}
	return units[sc]
}

func (d Distance) String() string {
	return fmt.Sprintf("%v %v", d.number, d.unit)
}

As funções do pacote fmt chamam estes métodos ao formatar valores Distance:

kmUnit := Kilometer
kmUnit.String()
// => km

mileUnit := Mile
mileUnit.String()
// => mi

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km
Editar via GitHub A ligação abre numa nova janela ou separador

Aprende Stringers