Tracks
/
Go
Go
/
Temario
/
Stringers
St

Stringers en Go

1 ejercicio

Acerca de Stringers

Stringer es una interfaz para definir el formato de string de los valores.

La interfaz consiste en un único método String:

type Stringer interface {
    String() string
}

Los tipos que quieran implementar esta interfaz deben tener un método String() que devuelva una representación del tipo en formato string que sea fácil de leer para una persona. El paquete fmt (y muchos otros) buscará este método para dar formato e imprimir valores.

Ejemplo: distancias

Supongamos que estamos trabajando en una aplicación que maneja distancias geográficas medidas en distintas unidades. Definimos los tipos DistanceUnit y Distance de la siguiente manera:

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

En el ejemplo anterior, Kilometer y Mile son constantes de tipo DistanceUnit.

Estos tipos no implementan la interfaz Stringer, ya que no tienen el método String. Por lo tanto, las funciones de fmt imprimirán los valores de Distance usando el «formato predeterminado» de 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 que la salida sea más informativa, implementamos la interfaz Stringer para los tipos DistanceUnit y Distance agregando un 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)
}

Las funciones del paquete fmt llamarán a estos métodos cuando den formato a valores de Distance:

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

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

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km
Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Stringers