TG Telegram Group & Channel
Go Update | United States America (US)
Create: Update:

Предопределенный идентификатор zero - универсальное нулевое значение для возврата и сравнений.

Тем времени поезд нововведений от Расса и не думает останавливаться. Вообще это предложение уже высказывалось много раз, но только после прихода дженериков стало понятно, отрицать необходимость подобного больше возможности нет.

Из главного:
- Появлется новый предопределенный идентификатор zero. В отличии от ключевого слова (типо type) он может быть переопределен в контексте поэтому ваш старый код который использует zero как переменную или метод, продолжит работать и дальше.
- Переменные любого типа поддерживают сравнение с zero.
- Переменным имеющим тип всегда можно присвоить zero. Будут работать конструкции var my Struct = zero или myInt := int(zero) но вот i := zero работать не будет.
- Из функций и методов можно возвращать данные с использованием новой конструкции. Например вот так return zero, zero, err
- Сравнение с zero доступно внутри дженерик функций у которых на типы-параметры стоит констрейнт any. В данный момент это очень большая головная боль для тех кто пишет библиотеки со структурами данных.

Фактически zero это аналог nil только покрывающий вообще все типы.

Из главных мотиваторов нового предложения по улучшению языка Кокс выделел две вещи:
- Ему надоело объяснять зачем нужна конструкция *new(T) и он уверен что мы можем лучше.
- Вопрос сравнения с нулевым значением внутри дженерик функций встал особенно остро после принятия cmp.Or о котором я обязательно расскажу в других сообщениях.

На вопрос почему не использовать _ Рас ответил, что if myVal == _ { … } выглядит неидиоматично. А вот на вопрос почему не расширить nil ответ посложнее - многие потенциальные баги были пойманы на этапе компиляции за счет того, что nil работает только с map/slice/chan/interface/pointer и эту семантику хотелось бы сохранить и в будущем. Из реального примера, Расс приводит ситуацию когда человек написал if(someValue) вместо if(*someValue) в Сишном коде, что привело к значительно потере данных внутри Google (решилось через резервные системы).

От себя добавлю - как и в случае с min/max ситуация назрела и перезрела. Особенно остро это ощущается на бизнес логике, где люди что бы не писать return MySomeRandomStruct{}, err использовали указатели и не понимали к каким следствиям это может привести.

func checkForZero(potentialZero MyType) (SomeType, error) {
if val == zero {
return zero, errors.New("is zero")
}

return SomeType(val), zero
}


Скоро и в вашем коде…

Предопределенный идентификатор zero - универсальное нулевое значение для возврата и сравнений.

Тем времени поезд нововведений от Расса и не думает останавливаться. Вообще это предложение уже высказывалось много раз, но только после прихода дженериков стало понятно, отрицать необходимость подобного больше возможности нет.

Из главного:
- Появлется новый предопределенный идентификатор zero. В отличии от ключевого слова (типо type) он может быть переопределен в контексте поэтому ваш старый код который использует zero как переменную или метод, продолжит работать и дальше.
- Переменные любого типа поддерживают сравнение с zero.
- Переменным имеющим тип всегда можно присвоить zero. Будут работать конструкции var my Struct = zero или myInt := int(zero) но вот i := zero работать не будет.
- Из функций и методов можно возвращать данные с использованием новой конструкции. Например вот так return zero, zero, err
- Сравнение с zero доступно внутри дженерик функций у которых на типы-параметры стоит констрейнт any. В данный момент это очень большая головная боль для тех кто пишет библиотеки со структурами данных.

Фактически zero это аналог nil только покрывающий вообще все типы.

Из главных мотиваторов нового предложения по улучшению языка Кокс выделел две вещи:
- Ему надоело объяснять зачем нужна конструкция *new(T) и он уверен что мы можем лучше.
- Вопрос сравнения с нулевым значением внутри дженерик функций встал особенно остро после принятия cmp.Or о котором я обязательно расскажу в других сообщениях.

На вопрос почему не использовать _ Рас ответил, что if myVal == _ { … } выглядит неидиоматично. А вот на вопрос почему не расширить nil ответ посложнее - многие потенциальные баги были пойманы на этапе компиляции за счет того, что nil работает только с map/slice/chan/interface/pointer и эту семантику хотелось бы сохранить и в будущем. Из реального примера, Расс приводит ситуацию когда человек написал if(someValue) вместо if(*someValue) в Сишном коде, что привело к значительно потере данных внутри Google (решилось через резервные системы).

От себя добавлю - как и в случае с min/max ситуация назрела и перезрела. Особенно остро это ощущается на бизнес логике, где люди что бы не писать return MySomeRandomStruct{}, err использовали указатели и не понимали к каким следствиям это может привести.

func checkForZero(potentialZero MyType) (SomeType, error) {
if val == zero {
return zero, errors.New("is zero")
}

return SomeType(val), zero
}


Скоро и в вашем коде…


>>Click here to continue<<

Go Update




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)