Golang Инициализация описывает способ присоединения методов к произвольному объекту на языке программирования Go. Например, они показывают метод String
для вновь определенного типа ByteSize
:
type ByteSize float64
const (
_ = iota; // ignore first value by assigning to blank identifier
KB ByteSize = 1<<(10*iota);
MB;
GB;
TB;
PB;
YB;
)
Возможность прикрепить метод, такой как String, к типу, позволяет таким значениям автоматически форматировать себя для печати, даже как часть общего типа.
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)
}
Что мне не ясно, так это следующее: если ByteSize
и func (b ByteSize) String() string
оба определены в каком-либо пакете, я импортирую этот пакет, но хочу настроить отображение ByteSize
, написав с использованием моего собственного строкового метода, как Go узнает, вызывать ли мой собственный строковый метод или ранее определенный строковый метод? Можно ли вообще переопределить строку?