1. Go / Говнокод #28254

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    package main
    
    import "log"
    
    func foo(x int) (int, error) {
        return x + 1, nil
    }
    
    func main() {
        x := 5
        if x % 2 == 1 {
            x, err := foo(x)
            if err != nil {
                log.Fatalf("Error")
            }
            log.Println(x)
        }
        log.Println(x)
    }

    Счастливой отладки, суки.

    https://godbolt.org/z/6GWsq7W7q

    Запостил: 3_dar, 29 Июня 2022

    Комментарии (47) RSS

    • Каким же надо быть недоноском, чтобы кодить на этом govne.
      Нет силенок изучить что-то посерьезнее?..
      Ответить
    • А что там за пиздопротивный асесблекр такой?
      Что такое FUNCDATA?

      >The Go compiler outputs an abstract, portable form of assembly that doesn't actually map to any real hardware.

      понятно. LLVM очередной
      Ответить
    • Именно поэтому я за умолчательный coпзт у значений, которые не имеют мудификаторов.

      Хочешь пельменную? Изволь писать var.

      https://govnokod.ru/26961#comment576189
      Ответить
    • какой багор)) а внутренний x не затенит внешний? то есть ты тупо переписал хэ???
      Ответить
      • Затенит. В этом и багор что при выходе из скоупа там опять 25.
        Ответить
        • а)) какой Багратино

          А вот я за давание в ибло за случайное затенение.

          Хочешь затенить (бывают такие лагоритмы, где удобно затенять) -- ставь подавляющую собачку
          Ответить
    • Рекомендую попробовать нормальные языки:
      function foo(x){
          return [x + 1, null];
      }
      
      var x = 5;
      if (x % 2 == 1 ){
          var [x,err]=foo(x);
          if (err!=null){
              console.fatal("Error");
          }
          console.log(x);
      }
      console.log(x);

      https://ideone.com/LqUzte
      Ответить
      • eslint мне такой код не пропустит
        Ответить
        • > 'console' is not defined. (no-undef)
          Ахаха. Выбрось его на помойку
          Ответить
          • что не так, пишуток? в Ecma 262 нету ниуакой console. Она есть только в node и бравзщере

            скажи

            env: {
            browser: true,
            node: true,
            },

            и будет заябись
            https://eslint.org/docs/latest/rules/no-undef#environments
            Ответить
      • Вот на нормальном языке:
        (int, object?) Foo(int x) => (x + 1, null);
        
        var x = 5;
        if (x % 2 == 1)
        {
            //var (x, err) = Foo(x); // CS0136  A local or parameter named 'x' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter
        
            (x, var err) = Foo(x);
            if (err is not null) Console.Error.WriteLine("Error");
            Console.WriteLine(x); //6
        }
        Console.WriteLine(x); //6
        Ответить
        • Шарп годный, да. Правда, мы тут недавно с него ржали, как там надо в Disposable вручную делать SuppressFinalize или как-то так
          Ответить
          • Справедливости ради можно заметить, что если нет анменеджед и финализатора, то пиздец с void Dispose(bool disposing) и GC.SuppressFinalize(this) не нужен. В сисярпике просто решили сразу и неявное (через финализатор), и явное (через Dispose()) освобождение ресурсов сделать, вот и приходится при явном подавлять финализатор (если он есть).
            Ответить
            • Какой-то статический анализатор ругается на отсутствие суппреса вроде.

              Но вообще обсёр GCблядей и их ручное управление ресурсами это прича во языцех: Джависты тоже такой хуец сосут, и всякие питонисты тоже.

              И только в божественных языках типа C++ и ObjC со siwft все закрывается само
              Ответить
              • >Какой-то статический анализатор ругается на отсутствие суппреса вроде.
                А он абсолютно всегда ругается? Понятное дело, что большинство адекватных людей реализуют dispose по каноничному паттерну, когда в Dispose() для очистки анменеджед ресурсов используется тот же самый код, что и в финализаторе, тогда конечно GC.SuppressFinalize(this) необходим, чтоб по второму кругу одно и то же не делать. Да даже если нет финализатора, то ничего страшного от этой строки не случится.
                Но что если говнокодер решил реализовать dispose по-своему, потому что он так видит? Например, в финализаторе чистятся анменеджед ресурсы, а в Dispose() в силу каких-то неведомых причин — только менеджед. Если в таком случае воспользоваться подсказкой анализатора и добавить SuppressFinalize, то после вызова Dispose() до анменеджед ресурсов дело никогда не дойдёт!

                >обсёр GCблядей и их ручное управление ресурсами
                Да это вообще пиздец. Сначала они говорят, у нас же тут GC, говнокодь спокойно, не думай ни о чём, сборщик мусора говно за тобой подберёт. Но на деле ты сидишь и вилкой чистишь дёргаешь Dispose() (хорошо хоть юзинги есть, всё лучше, чем Dispose() явно вызывать), а потом в рантайме охуеваешь от того, что уже задиспоженный объект оказывается где-то ещё использовался...
                Ответить
                • > Сначала они говорят, у нас же тут GC, говнокодь спокойно
                  Потом оказывается, что ресурсы это не только память.
                  Потом оказывается, что ресурсы нужно освобождать как-то по особому (Жаба обсирается со своими незапускающимися финализаторами и прикручивает костыли)
                  Потом оказывается, что на компьютере запущена не только твоя программа, ресурсами надо делиться и освобождать их СЕЙЧАС, а не когда GC раздуплится. (Обсираются все, прикручивают костыли)
                  Ответить
                  • Сначала зомбируемому предлагают представить ресурсы.

                    Потом говорят, что ресурсы — это не только память, и предлагают представить открытые файлы.

                    Потом предлагают смешать память и файлы.

                    Когда зомбируемый предлагает закрыть ресурсы, чтобы дать поработать другим программам, зомбирующий повторяет: «Зачем? Зачем?»
                    Ответить
                  • Мой любимый пример в йажа это memory mapped file.
                    Он возвращает DirectBuffer (такое окошко в неуправляему память), которое никак не уничтожить кроме как через GC

                    Еще раз по буквам: заммапленный в память файл нельзя закрыть!
                    У дотнетблядей MemoryMappedFile хотя бы IDisposable, а у жабойобов нет

                    Жавайобы ловко выходят из положения
                    https://stackoverflow.com/questions/2972986/how-to-unmap-a-file-from-memory-mapped-using-filechannel-in-java/19447758#19447758
                    Ответить
                    • Ничего себе. Не знал про такое.

                      >ByteBuffer.allocateDirect(4096);
                      Ахаха. В Йажу завезли malloc/free.
                      Какое русное управление памятью )))

                      Edit 1:
                      > sun.misc.Cleaner
                      Блять, и предлагают использовать кишки jvm из пакета sun.*
                      А в следующей жвм это выпилят нахуй.
                      Write once — debug everywhere.

                      Edit 2:
                      Пхахахах. В приведённом ответе они пошли ещё дальше и т.к. 9й жове всё сломали, они... используют другой класс из кишком жвм jdk.internal.misc.Unsafe.
                      Пиздец²
                      Ответить
                      • DirectBuffer имеет еще несколько багров.

                        Во-первых он не отличается интерфейсом от обычного буффера, и узнать можно только в рантайме.

                        Некоторый кот идет в byte[] (который есть в обычном буффере) и падает если буфер дайрект

                        Я использовал direct buffer для общения с либами, котоыре умеют неуправляемую память, бо писаны на си, и подключены чирез JNI/JNA

                        В частности zstd, xxhash, и кто-то для реализации http2 (апаче поди)
                        JCEF так же передает указатель на DirectBuffer.
                        Можно налажать, и упасть врантайме

                        Во-вторых, когда у тебя кончается неуправляемая память, ты получаешь OOM, но в дампе ты видишь хуй, потому что все yourkitы и прочие профилировщики показывают тебе только кучу

                        ну и третий багор это невозможность сделать free (ну или close в случае mmap) без платформозависимой рефлексии
                        Ответить
                        • >и третий багор это невозможность сделать free (ну или close в случае mmap) без платформозависимой рефлексии

                          Ой, не могу. Там весь ответ достоен отдельного поста.

                          >From the MappedByteBuffer javadoc:
                          > A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself is garbage-collected.
                          > Try calling System.gc()? Even that's only a suggestion to the VM.

                          В любой непонятной ситуации вызывай System.чисти-чисти-чисти()


                          > The method covered in other answers that employs ((DirectBuffer) byteBuffer).cleaner().clean() doesn't work on JDK 9+ (even in reflective form) without displaying an An illegal reflective access operation has occurred warning.
                          > This will stop working altogether in some future JDK version.
                          > Fortunately sun.misc.Unsafe.invokeCleaner(ByteBuffer ) can make that exact same call for you without the warning: (from OpenJDK 11 source):

                          Нет, ну почему жавухи такие выблядки?
                          Нахуя было делать шалаш из костылей, обмазанных говном, а потом ломать обратную совместимость?
                          Ответить
                • Токмо если речь про unlanaged ресурсы, но тем не менее.
                  Надо еще потом вручную dispose у детей дергать
                  https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose
                  куча бойлерплейта
                  class DerivedClassWithFinalizer : BaseClassWithFinalizer
                  {
                      // To detect redundant calls
                      private bool _disposedValue;
                  
                      ~DerivedClassWithFinalizer() => this.Dispose(false);
                  
                      // Protected implementation of Dispose pattern.
                      protected override void Dispose(bool disposing)
                      {
                          if (!_disposedValue)
                          {
                              if (disposing)
                              {
                                  // TODO: dispose managed state (managed objects).
                              }
                  
                              // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
                              // TODO: set large fields to null. <-- В ЭТОМ МЕСТЕ Я ХРЮКНУЛ
                              _disposedValue = true;
                          }
                  
                          // Call the base class implementation.
                          base.Dispose(disposing);
                      }
                  }

                  Есть еще вот такая писька, это попытка превратить хендлеры в управляемые ресурсы
                  https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.safehandl e

                  А какой-нить свифтер с ARC наверное со смеху лопнет
                  Ответить
    • Мой вердикт таков: копрофажным тут является факт сокращенной записи декларанции плюс дефиниции.

      Если бы там было явно var, то инею бы понял, что он декларирует какую-то другую пельменную, и та тенит эту

      Однако ловкое смешивание декларации с присваиванием сыграло с пастором злую шутку
      Ответить
      • Вердикт: тупое Govno.

        Вот в ЙС как не напишешь, всё понятно и работает логично.

        Ещё я пробовал ворнинг какой-то из goвна вымучить. Но флаги тотально уебанские, ничего полезного оно не высирает.
        Ответить
        • https://youtu.be/DNtVNHgQnNY?t=82
          Ответить
        • https://github.com/golang/go/issues/377

          This issue now tracks various proposals that have been made, among them:
          * disallow shadowing outer variables
          * allow arbitary expressions on the lhs
          * don't require something new on the lhs

          По военной дороге
          Шел в борьбе и тревоге
          Боевой двенадцатый год этого сраного issue
          Ответить
        • > Ещё я пробовал ворнинг какой-то из goвна вымучить.

          int main(void) {
              int x = 5;
              if (x % 2 == 1 ){
                  int x = 6;    	
                  printf("%d\n",x);
              }
              printf("%d\n",x);
          }


          Справедливости ради в gcc/clang/g++/clang++ с кобенацией -Wall -Wextra -Wpedantic не пишет ничего.

          Нужен явный -Wshadow.
          Ответить
    • Настоятельно рекомендую попробовать языки для белых людей.
      <?php
      
      function foo($x){
          return [$x + 1, NULL];
      }
      
      $x = 5;
      if ($x % 2 == 1 ){
          [$x,$err]=foo($x);
          if ($err!==NULL){
              echo "Error";
          }
          echo ($x.PHP_EOL);
      }
      echo ($x);
      
      https://ideone.com/01yiBU
      Ответить
      • Мне кажется порою, что солдаты,
        С кровавых не пришедшие полей,
        Не в землю эту полегли когда-то,
        А превратились в белых лошадей.
        Ответить
      • фу

        У нас в перле например есть два скоупа: my и our. Первый работает на уровне блоков, второй -- на уровне модуля (по сути это как автоматическая и глобальная пельменная в няшке)

        Можно и не указывать my/our, но тогда тебя выебет стрикт мод и критик в придачу

        а у пыха я не понимаю, что где определяется

        В целом, неявная декларация это скорее плохо

        -------
        фанни факт: в перл4 был только our, и это порождало бугурт. По счастью, многие программисты современные тогда еще не родились
        Ответить
        • Фу.

          У нас в «PHP», например есть два скоупа. global и local.
          Первый работает на уровне функций, второй на уровне мудуля.
          Чтобы взять глобальную пельменную в функции нужно объявить её через слово global (или взять в спец. масиве)

          > а у пыха я не понимаю, что где определяется
          <?php
          
          $a = 1; 
          $b = 2; 
          
          function bagor()
          { 
          //здесь $a недоступно
              global $b;
              echo $b; 
          } 
          bagor();

          https://ideone.com/kgtER4

          > В целом, неявная декларация это скорее плохо
          В «PHP» всё явно. Именно поэтому я за «PHP».

          EDIT: * ещё есть третий режим, это захват внешних пельменных в лямбды через use ()
          Ответить
          • Явные замыкания у лямбд почему-то есть только в крестах и в «PHP».
            Ответить
            • И это хорошо. Уже разбирали много раз.

              А кудахтушки только кудахтают: «Да вот у нас в пёрле, да вот у нас в питоне. РНР это фууу».

              А в реальности, уже лет пять как PHP — это чемпионский скриптовый язык.

              Причём он сливает даже конпелируемую Йажу. Которой нужна кастомная реализация ArrayGLista без боксинга чтобы показать что-то приличное.

              https://blog.famzah.net/2016/02/09/cpp-vs-python-vs-perl-vs-php-performance-benchmark-2016/
              > The clear winner among the script languages is… PHP 7.

              > Yes, that’s not a mistake. Apparently the PHP team did a great job! The rumor that PHP 7 is really fast confirmed for this particular benchmark test.
              Ответить
              • интересно, что ЙАЖА slower than C++ 1281%
                Ответить
                • https://blog.famzah.net/2010/07/01/cpp-vs-python-vs-perl-vs-php-performance-benchmark/#comment-4084

                  Java 8 (non-std lib) slower 27%
                  Ответить
                  • не, ну динамический список интов в жава это ошибка природы же
                    Ответить
                    • А иначе пирформанс хуже чем... в PHP.

                      Притом что в PHP используются компоненты сугубо из коробки:
                      https://github.com/famzah/langs-performance/blob/master/primes.php
                      Ответить
                • Йажа-сектанты любят совмещать два тезиса:
                  * язык компилируемый, есть Hotspot и JIT. Потому он работает почти так же быстро как Сишка
                  * язык удобный, высокоуровневый с богатой стандартной библиотекой, лямбдами, форычами и прочими плюшками

                  Только вот дело в том, чтобы Йажа заработала на скоростях, сопоставимых с Сишкой, нужно
                  а) отказаться от форычей, лямбд, стримов
                  б) из-за боксинга отказаться от стандартных коллекций, списков, очередей и прочих контейнеров.
                  Придётся писать руками свои контейнеры IntList, или брать third party либы.

                  То есть писать в стиле, похожем... на Сишку.
                  Ответить
                  • Интересно, что std коллекции в С++, которые наверное супернеоптимальны с точки зрения няшника, все равно уделывают жабье говно с ее враппингом
                    Ответить
    • ik kook kip
      Ответить
    • var err error
      x, err = foo(x)

      Всегда было забавно, как добавление «удобного лаконичного синтакса» часто добавляло нового смешного майндфака.
      Ответить

    Добавить комментарий