3
Golang Initialization描述了一种将方法附加到Go编程语言中的任意对象的方法。作为一个例子,它们示出了用于新定义的ByteSize
类型String
方法:Go中的函数冲突
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中,您有这样的优势,即对象本身不必是新类型的。您可以从任何地方获取ByteSize,将其保存到MyByteSize类型的变量中,然后使用您自己的方法。 – 2009-11-13 22:31:28
另外,ByteSize和MyByteSize之间的转换是IIRC自由的,因为内部表示是相同的。 – 2011-02-25 17:55:31