假设我想创建一个数据类型Unit
,该数据类型的float值介于0.0和1.0之间:
type Unit struct {
value float64
}
func NewUnit (v float64) *Unit {
if v >= 0.0 && v <= 1.0 {
return &Unit{v}
} else {
panic("OMG, wrong value here!!1!")
}
}
因此,如果我正常创建它,则一切正常:
oneHalf := NewUnit(0.5)
fmt.Println(oneHalf)
//~ tooLarge := NewUnit(1.1) // Raises exception, as it should
//~ fmt.Println(tooLarge)
但是问题是我只能创建一个结构文字并绕过我的工厂方法:
evil := &Unit{1.1}
fmt.Println(evil)
首先要破坏创建此结构的目的。
(当然,即使我使用factory方法创建结构,也可以稍后更改,因为Go中没有什么是真正不变的。但是我可以使用getter或类似的方法来处理它,对吧?)< / p>