Дженерики Go не плохи

портрет2018facebook.jpg

При программировании нам часто приходится писать «общие» функции, где точный тип данных не важен. Например, вы можете написать простую функцию, которая суммирует числа.

До недавнего времени в Go не было этого понятия, но недавно оно было добавлено (начиная с версии 1.18). Так что я взял его на спину.

В Java дженерики работают достаточно хорошо, пока вам нужны «универсальные» контейнеры (массивы, карты) и пока вы придерживаетесь функциональных идиом. Но Java не позволяет мне кодировать так, как я бы предпочел. Вот как я бы написал функцию, которая суммирует числа:

 целая сумма ( инт [ ] v ) {          целое лето = 0 ;          для ( int k = 0 ; k < v . длина ; k + + ) {              лето + знак равно v [ k ] ;          }          вернуться летом ;      }  

Что делать, если мне нужно поддерживать различные типы номеров? Затем я хотел бы написать следующую общую функцию, но Java не позволяет мне.

 // этот Java-код не будет компилироваться      статический < T extends Number > T sum ( T [ ] v ) {          Т лето = 0 ;          для ( int k = 0 ; k < v . длина ; k + + ) {              лето + знак равно v [ k ] ;          }          вернуться летом ;      }  

Go не является объектно-ориентированным как таковым, поэтому у вас нет класса «Число». Однако вы можете создавать свои собственные общие «интерфейсы», которые выполняют ту же функцию. Итак, вот как вы решаете ту же проблему в Go:

 тип числовой интерфейс {    унт | инт | поплавок32 | поплавок64  }      func sum [ T Number ] ( a [ ] T ) T {      вар лето Т      для _ , v : = диапазон ( а ) {          лето + = v      }     верни лето  }    

Итак, по крайней мере, в этом случае дженерики Go более выразительны, чем дженерики Java. Как насчет производительности?

Если я применю приведенный выше код к массиву целых чисел, я получу следующий замкнутый цикл в ассемблере:

 ПК11:          MOVQ ( AX ) ( DX * 8 ) , СИ          INCQ DX          АДДК СИ , СХ          CMPQ BX , DX          JGT pc11  

Что касается Go, это настолько эффективно, насколько это возможно.

Пока что я даю дженерикам пятерку.

Leave a Comment

Ваш адрес email не будет опубликован.