軌道
/
Go
Go
/
課程大綱
/
Stringers
St

Stringers 在 Go

1 個練習

關於 Stringers

Stringer 是一個用來定義值字串格式的介面。

這個介面只包含一個 String 方法:

type Stringer interface {
    String() string
}

想要實作這個介面的型別,必須有 String() 方法,回傳該型別易於人類閱讀的字串表示。 fmt 套件(以及許多其他套件)會尋找這個方法來格式化和印出值。

範例:距離

假設我們正在開發一個應用程式,用來處理以不同單位測量的地理距離。 我們定義了DistanceUnit和Distance這兩個型別,如下所示:

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

在上面的範例中,Kilometer和Mile是型別為DistanceUnit的常數。

這些型別沒有實作Stringer介面,因為它們缺少String方法。 因此fmt函式會使用 Go 的「預設格式」來印出Distance值:

mileUnit := Mile
fmt.Sprint(mileUnit)
// => 1
// The result is '1' because that is the underlying value of the 'Mile' constant (see constant declarations above)

dist := Distance{number: 790.7, unit: Kilometer}
fmt.Sprint(dist)
// => {790.7 0}
// not a very useful output!

為了讓輸出更有意義,我們為DistanceUnit和Distance型別實作Stringer介面,替每個型別加上String方法:

func (sc DistanceUnit) String() string {
	units := []string{"km", "mi"}
	return units[sc]
}

func (d Distance) String() string {
	return fmt.Sprintf("%v %v", d.number, d.unit)
}

fmt套件的函式在格式化Distance值時,會呼叫這些方法:

kmUnit := Kilometer
kmUnit.String()
// => km

mileUnit := Mile
mileUnit.String()
// => mi

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 Stringers