На этом шаге мы продолжим рассматривать пример реализации пользовательского типа с единственным значением.
Метод String() реализует интерфейс fmt.Stringer, т.е. значения типа NLogic будут выводиться, как указано в функции, и могут передаваться везде, где ожидается значение, реализующее интерфейс fmt.Stringer.
func (log *NLogic) String() string { return fmt.Sprintf("%.0f%%", 100*log.val) }
Значения типа NLogic будут выводиться в виде целого числа процентов.
Метод Set() обеспечивает изменяемость значений типа NLogic.
func (log *NLogic) Set(val interface{}) (err error) { log.val, err = float32ForValue(val) return err }
В функции выполняются операции с существующим значением *NLogic. Если полученное значение val является недопустимым, вызывающей программе возвращается непустое значение типа error и предполагается, что она проверит его.
Для типов, значения которых передаются по указателю, бывает удобно реализовать метод Copy().
func (log *NLogic) Copy() *NLogic { return &NLogic{log.val} }
Данный метод создает новое значение типа NLogic, копию приемника и возвращает указатель на него. Здесь нет необходимости проверять допустимость исходного значения, так как приемник всегда будет иметь допустимое значение. При этом предполагается, что при создании оригинального значения вызовом функции New() и его последующих изменениях с помощью метода Set() было получено пустое значение типа error.
На следующем шаге рассмотрим реализацию логических функций в данном примере.