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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top