Предположим, я хочу создать тип данных Unit
, который содержит значение с плавающей запятой в диапазоне от 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)
Какой тип поражает цель создания этой структуры в первую очередь.
(Конечно, даже когда я создаю свою структуру с помощью фабричного метода, она все равно может быть изменена позже, поскольку в Go нет ничего неизменного. Но я мог бы справиться с этим, используя геттеры или что-то в этом роде, верно?)