Все потоки
Поиск
Написать публикацию
Обновить

Комментарии 21

Всё так! Но есть ли такой язык, в котором всё хорошо и ничего не бесит и со статической типизацией? Подскажите такой язык, буду прогать на нём просто для души.

Может, этот?

https://www.roc-lang.org/

Язык хороший, но он пока в альфа-версии. Ещё неизвестно, станет ли он кому-то нужен.

Purebasic)))

Gleam: https://gleam.run/

Про него был подкаст недавно у "Подлодки"

C#

Тут либо я совсем уж тупой, либо лыжи не едут.

Если вы угадали [hello world !], то вы знаете больше, чем кто-либо должен знать о причудах дурацкого языка программирования.

Мы создали слайс 0:0 по массиву и отправили его в функцию. В функции мы решили при помощи append растянуть массив. Append по слайсу, Карл! Потом удивляемся а почему не отработало.

Go не удовлетворился одной ошибкой на миллиард долларов, поэтому они решили иметь два варианта NULL.

nil как отсутствие ссылки и nil как отсутствие значения, сначала люди ноют, что документация в каком-либо продукте плохая, а затем сами её не читают.

Постойте, что? Почему err используется повторно для foo2()?

Берем и именуем внешние и внутренние поля скоупов по разному и получаем однозначное предсказуемое поведение.

Потом удивляемся а почему не отработало.

Оно сработало. Просто неожиданно. :)

Тут либо я совсем уж тупой, либо лыжи не едут.

Лыжи не едут. Срезы в go устроены так: структура (ссылка на буфер, размер, вместимость). Пока кол-во вставляемых элементов не превышает вместимость среза - они просто дописываются в буфер и увеличивается размер. Если превышено - увеличивается вместимость, выделяется новый буфер, память копируется в него, переключаемся на новый буфер. И далее как выше. Вместимость кратна степени двойки.

Первый случай:

a - срез с размером 3, вместимостью 4.

Передаём в функцию срез с него с тем же буфером, размером 1, вместимостью 4.

Добавляем один элемент. Это не превышает вместимость, буфер остаётся прежним, NIGHTMARE пишется в буфер, переписывая world.

Второй случай.

Добавляем 4 элемента, это превышает вместимость - размер, по этому в функции буфер среза копируется, отвязывая его от буфера исходного среза и добавляет в него элементы. Но буфер исходного среза не затронут.

По этому я и написал в первой статье тот каммент.

С самого начала же проговаривается, что slice это структура данных только указывающая на массив. Очевидно, что и при копировании скопируется только slice, а не массив на который он указывает.

Насчет defer, кажется можно сделать так

f, err := openFile()

if err != nil {
  return nil, err
}

defer function() {
  if cerr := f.Close(); cerr != nil && err == nill {
    err = cerr
  }
}()

if err := f.Write(something()); err != nil {
  return nil, err
}


– Бэрримор, кто снова воет на болотах!?

– Гоферы, сэр....

Дык это не гоферы воют, а джависты, которые пришли в го с какими-то своими представлениями и не читали документацию и best practice. Плюс набрали всяких синтетических примеров типа как на собеседованиях задают. У нормальных гоферов все в порядке, потому что код как в статье никто в реале не пишет.

P.S. странно, что автор не докопался до контекстов и горутин. Вот где пострадать можно! А то давайте в 100500 раз поноем про область видимости ошибки в го - явно, что автор сам на языке не писал нормально :-)

Код был бы намного легче читать, если бы область видимости err была меньше. Но это синтаксически невозможно в Go.

Почему же синтаксически невозможно? Можно обработку по блокам раскидать:

	var bar Type1
	{
		var err error
		bar, err = foo()

		if err != nil {
			return err
		}
	}

	{
		if err := foo2(); err != nil {
			return err
		}
	}

Человек не выучил и не разобрался в Golang. И начинает писать на нем как привык в XYZ. Вот и результат - поток чуши. Нет бы покритиковать GC к примеру (есть что критиковать).

Об том и речь, что у тех, кто написал на языке больше одного проекта, совершенно другие боли.

Это автор явно не трогал горутины, каналы и контекст. Вот там вот дофига не очевидного.

Тут есть еще такая ловушка, как результат позиционирования "Golang простой и ничего там такого нет".

И многие потому решают что документацию читать - не надо. понимать как работает Runtime и компоненты - не надо. Сдедить за релизами и изменением поведения - не надо.

а ведь это нет так - нюансов много и разбираться надо без дураков

На самом деле все ещё интереснее.

  1. Го простой. Но только по синтаксису.

  2. В го можно писать без многопоточности, каналов, синхронизаций и прочей магии просто тупо в лоб как на PHP, но тогда в чем смысл его брать?

  3. Асинхронности и её синхронизация это тема в принципе непростая и здравый смысл здесь часто работает не очевидно :-)

  4. И это я ещё про оптимизации по памяти ничего не писал.

Человек не удосужился выучить Golang и требует, чтобы в нем было то, к чему он привык в условной Java. Особенно "умилили" претензии к defer который назван "глупым"

Всё правильно написано.
Не надо привыкать к глюкам, надо чтоб глюков не было.
Но это всё равно мелкие недостатки, не страшно

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации