ufm: (Default)
[personal profile] ufm

Вобще язык поражает своей… Не знаю как это назвать. Неконсистенстностью?

Можно определить в модуле неэкспортируемый тип? Можно. И пользоваться этим типом снаружи не получится.

Но зато из этого модуля можно вернуть значение этого типа. Его можно присвоить переменной. И даже пользоватся этой переменной (методы там вызывать).

Но передать эту пременную в свою функцию — нельзя. Потому что нельзя описать параметр (тип-то не экспортируемый). А если параметр описать как interface{} — то передать можно, но толком пользоваться — нельзя. У interface{} нет методов, например. Хотя, я подозреваю, через reflect можно дотянуться и до методов, но это уде совсем через жопу.

Можно в функцию передать переменное число параметров? Можно.
Можно из функции вернуть несколько значений? Можно.
Можно сделать вложенный вызов, так, что-бы возвращенные значения ушли напрямую в функцию с переменным числом параметров? Можно, но только если не будет дополнительных параметров.
Зачем было делать возможность возвращать несколько значений? А вот что-б не как Цэ, что-б функция могла вернуть значение и флаг успешности.
О! Наверное можно написать err, a, b, c, d: := fmt.Scanf(«%d %d %d %d») ? Неее. Нельзя. У функции может быть несколько возвращаемых значений, но не может быть переменное число возвращаемых значений.

Классы есть? Ну… Есть структуры с методами. Но конструкторов и деструкторов — нет. Так что если что, то ручками вызывай, не обломишься.

Лёгкие сопроцессы есть? Есть. Но методов контроля за ними — никаких.

А, вот еще прикол:


loop:
for {
break loop
}

Называется — догадайся куда мы выйдем после break.

Originally published at U.F.M's Homepage. You can comment here or there.

(no subject)

Date: 2014-04-22 13:28 (UTC)
From: [identity profile] iley (from livejournal.com)
В деструкторах которые будут вызваны "когда нибудь" по-моему очень мало толку. Если вы в деструкторе хотите освободить какой-то ресурс (а чаще всего именно для этого деструктор и нужен), то вы, как правило, хотите знать, когда это произойдёт. Иначе ресурс невозможно будет повторно использовать. А значит в языке с GC в любом случае освобождение ресурсов приходится делать через какой-то отдельный механизм. В Java это делают через try..finally, в Python -- через context managers, в Common Lisp через unwind-protect, а в Go вот через defer.

С остальными пунктами из поста я в целом согласен, но вот деструкторы тут не к месту.

(no subject)

Date: 2014-04-22 19:50 (UTC)
From: [identity profile] ufm.livejournal.com
На дворе - 14 год. Две тысячи. Космические коробли бороздят. Марсоходы и луноходы ездят. У меня в лаптопе - 6 гигов памяти и 4 ядра.

Можно это будет проблемй компилятора а не моей? Ну пожалуйста! :)

(no subject)

Date: 2014-04-23 13:23 (UTC)
From: [identity profile] sharpc.livejournal.com
Можно. Вы хотите C++ с RAII.