2009-11-13 71 views
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) 
} 

什麼是我不明白的是:若ByteSizefunc (b ByteSize) String() string都在包某處定義,我導入包,但想用我自己的字符串方法編寫定製的ByteSize顯示,如何做去知道是否調用我自己的字符串方法或以前定義的字符串方法?是否有可能重新定義字符串?

回答

9

的目的是讓你換一個類型,如果你想在這新的方法,讓您將定義

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

} 

您不能在類型定義模塊的方法之外它被定義我相信。

+4

沒錯。其他語言通過覆蓋子類上的方法來解決同樣的問題。但是在Go中,您有這樣的優勢,即對象本身不必是新類型的。您可以從任何地方獲取ByteSize,將其保存到MyByteSize類型的變量中,然後使用您自己的方法。 – 2009-11-13 22:31:28

+2

另外,ByteSize和MyByteSize之間的轉換是IIRC自由的,因爲內部表示是相同的。 – 2011-02-25 17:55:31