Как отключить структурные литералы - PullRequest
0 голосов
/ 05 июля 2019

Предположим, я хочу создать тип данных 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 нет ничего неизменного. Но я мог бы справиться с этим, используя геттеры или что-то в этом роде, верно?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...