4

Golang Initialization描述了一种在 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)
}

我不清楚的是:如果ByteSizefunc (b ByteSize) String() string都在某个包中定义,我导入该包但想ByteSize通过使用我自己的字符串方法编写来自定义显示,Go 如何知道是否调用我自己的字符串方法或之前定义的字符串方法?甚至可以重新定义字符串吗?

4

1 回答 1

10

目的是让您在需要新方法时包装类型,因此您可以定义

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

}

你不能在我相信它定义的模块之外的类型上定义方法。

于 2009-11-13T21:13:59.690 回答