Функциональные коллизии в Go - PullRequest
4 голосов
/ 14 ноября 2009

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 узнает, вызывать ли мой собственный строковый метод или ранее определенный строковый метод? Можно ли вообще переопределить строку?

1 Ответ

10 голосов
/ 14 ноября 2009

Цель состоит в том, чтобы вы обернули тип, если вам нужны новые методы, поэтому вы должны определить

type MyByteSize ByteSize
func (b MyByteSize) String() string{

}

Вы не можете определить методы для типа вне модуля, который был определен, я считаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...