Pregunta
Golang Inicialización describe una manera de unir métodos a objeto arbitrario en la programación Go idioma. A modo de ejemplo, muestran un método String
para un tipo ByteSize
recién definido:
type ByteSize float64
const (
_ = iota; // ignore first value by assigning to blank identifier
KB ByteSize = 1<<(10*iota);
MB;
GB;
TB;
PB;
YB;
)
La capacidad de adjuntar un método tal como de cadena a un tipo hace posible que tales valores para formatear sí mismos de forma automática para la impresión, incluso como parte de un tipo general.
func (b ByteSize) String() string {
switch {
case b >= YB:
return fmt.Sprintf("%.2fYB", b/YB)
case b >= PB:
return fmt.Sprintf("%.2fPB", b/PB)
case b >= TB:
return fmt.Sprintf("%.2fTB", b/TB)
case b >= GB:
return fmt.Sprintf("%.2fGB", b/GB)
case b >= MB:
return fmt.Sprintf("%.2fMB", b/MB)
case b >= KB:
return fmt.Sprintf("%.2fKB", b/KB)
}
return fmt.Sprintf("%.2fB", b)
}
Lo que no está claro para mí es la siguiente: si ByteSize
y func (b ByteSize) String() string
, se definen en un paquete en alguna parte, importo ese paquete, pero quiero personalizar la visualización de ByteSize
escribiendo usando mi propio método de cadena, ¿Cómo hace saber si se debe llamar a mi propio método de cadena o el método de cadena previamente definido? ¿Es incluso posible redefinir cuerda?
Solución
La intención es que envuelva un tipo si desea que los nuevos métodos en él, por lo que sería definir
type MyByteSize ByteSize
func (b MyByteSize) String() string{
}
No se puede definir métodos en un tipo fuera del módulo se define creo.