- 1
- 2
var m = map[int]string { 1: "one", 2: "two", 3: "three", }
if val, ok := m[3]; ok { fmt.Printf("Yes! %s\n",val) } else { fmt.Println("No!") }
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+96
var m = map[int]string { 1: "one", 2: "two", 3: "three", }
if val, ok := m[3]; ok { fmt.Printf("Yes! %s\n",val) } else { fmt.Println("No!") }
Почему в Go первое присваивание надо писать через =
А то что в if через :=
http://ideone.com/cPf2cw
http://ideone.com/fork/cPf2cw
3.14159265 01.06.2014 01:27 # +4
Сначала показалось - владельцы селеронов 600 будут довольны - в языке нет исключений, присваивание :=, типа быстрая компиляция.
Но потом оказывается - вместо исключений panic, equals ==, gc, да и сишкобляством несёт за версту, хоть и старались пофиксить.
Не. Тарасу явно не понравится.
Lure Of Chaos 01.06.2014 17:15 # +1
хотя. дело смоллтолка живет
3.14159265 01.06.2014 17:52 # 0
Потому что практически всё новое - это хорошо забытое старое.
roman-kashitsyn 01.06.2014 23:24 # 0
var m = эквивалентно m :=
guest 02.06.2014 00:31 # −1
3.14159265 02.06.2014 00:36 # 0
Я прочитал мануал.
>var m = эквивалентно m :=
Но вот этого не понял. Зачем два разных значка для объявления переменной? Сахарок, в языке, в котором по идее подобные излишества должны быть выкорчеваны на стадии проектирования.
При том что сравнение сделали обратно через уродское ==.
we believe Go's type syntax is easier to understand than C's, especially when things get complicated.
roman-kashitsyn 02.06.2014 09:55 # 0
На самом деле var используется только для неинициализированных переменных или при желании явно указать тип.
3.14159265 02.06.2014 11:27 # 0
a string:=""
var a string =""
bormand 02.06.2014 11:32 # 0
3.14159265 02.06.2014 11:36 # 0
1024-- 02.06.2014 13:27 # +1
А по мне - так фигня какая-то:
- иногда - лишнее слово var, которое потом надо читать
- с виду - присваивание значения типу: var a string =""
Да и "психологическая" модель чтения кажется мне неуместной:
"Здравствуйте, я - Вася, программист на крестах" - важен Вася и его психическое состояние,
"Программист Вася написал за неделю три новых класса" - важен программист и его результаты.
"я Маша, я - строка" - ну, привет, Маша, зачем ты здесь вообще?
"Запишем логин в строку Машу" - реализация алгоритма.
Сигнатуры - по типу, хугление - по типу, потребность в документации очевидного в жс - из-за отсутствия типов. Хоть ты и личность, Маша, но всё же ты - строка.
3.14159265 02.06.2014 13:39 # 0
> с виду - присваивание значения типу: var a string =""
Оно не лишнее. string можно не писать, он выведется автоматом.
var a="" //это уже как в привычном и любимом js
>Да и "психологическая" модель чтения кажется мне неуместной:
Это просто сишкоблядство прочно уселось в мозг.
> с виду - присваивание значения типу: var a string =""
Да это практически паскальное var i:Integer;
или бейсиковское Dim i as Integer
Только с автовыводом, возможности инициализации присваиванием и удалением : и as между переменной и типом.
1024-- 02.06.2014 13:54 # +2
Это уже "переменная a", порядок как в сишке, хотя по логике языка надо бы a:var := ""
> сишкоблядство прочно уселось в мозг
> это практически паскальное
сишкоблядство прочно уселось в мозг, паскальный синтаксис воспринимается как справка от врача.
roman-kashitsyn 02.06.2014 13:41 # +2
Указание типа ПЕРЕД именем переменной создаёт неоднозначность и приводит к унылым костылям. Поэтому практически все современные языки использую нотацию var name: Type.
Примеры:
1024-- 02.06.2014 14:03 # 0
А человек - не парсер, человек хочет писать код и в идеале плевать он хотел на грамматику языка и проблемы компилятора.
Как я понял из Ваших примеров, если добавить новую сущность (:), возникающую только при описании новой переменной, неоднозначность уходит, и можно жить.
T::my_type*: x; // тот же порядок, вместо typename и паскалепорядка
auto decltype(x + y): add(T x, T y);
roman-kashitsyn 02.06.2014 14:15 # +1
Ты, очевидно, мало шаблонного кода видел :)
> и в идеале плевать он хотел на грамматику языка и проблемы компилятора
У человека в точности такие же проблемы с парсингом, как и у компилятора.
Автору кода может быть понятно, что он хотел сказать, но мне лично трижды насрать на автора кода, мне важен тот, кто его будет читать.
> decltype(x + y): add(T x, T y);
Нельзя, потому и ввели дурацкую стрелку. Нужно знать, что такое "x" и "y" до того, как их увидишь в выражении.
Опять же, тип перед переменной вынуждает всегда писать либо сам тип, либо плэйсхолдер. С учётом того, что тип зачастую ясен и без явного его указания, паскалевский синтаксис более предпочтителен, т.к. позволяет опускать этот самый тип, используя его лишь как уточнение в случае необходимости. Scala:
3.14159265 02.06.2014 14:21 # +1
Ну дык Вирт же компилер и парсер делал, чтоб по LL(1) разбирать.
roman-kashitsyn 02.06.2014 14:22 # 0
я знаю, но для 1024-- это врядли будет аргументом :)
3.14159265 02.06.2014 14:23 # 0
Ну по всей видимости да :)
>>паскальный синтаксис воспринимается как справка от врача.
1024-- 02.06.2014 14:32 # 0
Если время парсинга исходников на практике сопоставимо (или больше) со временем компиляции, аргумент.
3.14159265 03.06.2014 00:08 # 0
1024-- 02.06.2014 14:28 # 0
Но у человека есть ещё комментарии, отступы по горизонтали и вертикали. А запутать в любом стиле можно
> паскалевский синтаксис более предпочтителен, т.к. позволяет опускать этот самый тип, используя его лишь как уточнение в случае необходимости
В C# смогли и типы, и var сделать без паскалевского синтаксиса.
roman-kashitsyn 02.06.2014 14:30 # +1
Я разве говорил, что это не реализуемо? Ты что-то путаешь.
> тип перед переменной вынуждает всегда писать либо сам тип (List<Lols>), либо плэйсхолдер (var)
Теперь посмотри, насколько убого сишарпные const, var и readonly смотрятся по сравнению со Scala.
1024-- 02.06.2014 14:48 # +1
>> паскалевский синтаксис более предпочтителен
Меня это зацепило. Как все уже слышали, мне нравится сишный порядок, и для меня нет смысла предпочитать что-то другое.
Про проблему массивов указателей я пока молчу, меня бы устроило что-то смешанное вида const & const[const * const int] - константная ссылка на константный массив константных указателей на константный int.
const[const int (int, int)] - легко распространяется на указатели на функции
const[const int (Type; int, int)] и функции-члены
roman-kashitsyn 02.06.2014 15:17 # 0
Здесь тоже всё просто решается - специальный синтаксис не нужен совсем. Нужно иметь встроенные параметризованные типы Ptr[T], Array[T], etc.
wvxvw 02.06.2014 19:38 # +1
тип, если он опциональный, хочется иногда опустить. Гораздо легче понять что тип, а что имя переменной если можно опустить только последнее слово в объявлении.
С порядком следования слов в русском языке сравнивать бесполезно по ряду причин:
- порядок следования слов в есстесственных языках такой не потому, что кто-то так задумал, проверил, что так лучше, и решил использовать. Порядок получился случайно, и как показывает практика других языков, у человека нет каких либо предпочтений к тому, где именно должно быть подлежащее, сказуемое и другие части предложения. Есть определенные правила, типа управление, анафора, фронтинг и т.д. которые предотвращают определенные "невозможные" порядки следования, тем не менее, эквивалентных вариантов тьма.
- люди не читают программы как прозу. Бессмысленно пытаться сделать програмы похожими на нее. Даже если добиться большой похожести, это не сделает програму понятнее, в большинстве случае - скорее наоборот. Эти два вида изложения преследуют разные цели: минимум разночтений для формальных языков и комбинацию фонетически приятных сочетаний с соответствием литературной традиции.
roman-kashitsyn 02.06.2014 19:54 # 0
> "я Маша, я - строка" - ну, привет, Маша, зачем ты здесь вообще?
"Запишем логин в строку Машу" - реализация алгоритма.
В английском порядок слов обратный.
My name is Masha. I'm a string.
Write a login to the masha variable of type string.
Более того, имена обычно не произвольные "маша". Они что-то означают. Причём их имя задаёт интерпретацию, оно обычно важнее их типа.
Что важнее - то, что в переменной login "хранится" логин пользователя, или то, что логин по случайности представлен строковым типом? Тип - это делаталь реализации, имя - часть ментальной модели.
3.14159265 02.06.2014 11:42 # 0
var a string - переменная a типа строка.
const b int32 - константа b типа целое
3.14159265 02.06.2014 13:59 # 0
Да по-моему они просто хотели угодить поцкалистам-делфятникам, возможно зная что многих сызмальства обучали(ют) именно на них.
Отсюда и странный способ записи массива
3.14159265 02.06.2014 00:58 # +2
var a []int
а обращение к элементам идёт по старинке: a[1]
В чем глубинная простата? Как это логически соотносится с самым сумасшедшим объявлением мапов, что я видел:
MapType = "map" "[" KeyType "]" ElementType .
Таки крестошаблоны и прочие женерики почитабельнее будут.
guest 02.06.2014 01:08 # +2
Это до которой пальцем не дотянешься?
roman-kashitsyn 02.06.2014 09:58 # 0
На самом деле это дело привычки. Кмк гошные декларации типов очень удобны, если к ним привыкнуть. По сути мы пишем в точности то, что говорим. Например, мапа из строки в мапу из строки в слайс указателей на целое:
map[string]map[string][]*int
defecate-plusplus 02.06.2014 10:01 # 0
чтобы отличить третий шаблонный параметр от продолжения второго
roman-kashitsyn 02.06.2014 10:09 # 0
из вколоченных в компилятор шаблоных типов: хэштабличка map[K]V, слайс []T и канал chan T.
3.14159265 02.06.2014 11:51 # 0
Ну я вчера думал над этим.
С мапой есть своя логика, m map [string] int в квадратных скобках означает что вспоследствии в m[] квадратных скобках появится строка. Но вот скобки в массиве-то нахрена менять местами ?
roman-kashitsyn 02.06.2014 12:28 # 0
>> По сути мы пишем в точности то, что говорим
Кмк, правильно, что выпилили эту дурацкую сишную непонятную нотацию.
[]int - массив целых
[]*int - массив указателей на целое
int[] - массив целых? ok.
*int[] - указатель на массив целых? или массив указателей на целое?
3.14159265 02.06.2014 12:39 # +2
roman-kashitsyn 02.06.2014 10:05 # +2
1. Отсутствие динамической линковки, мегабайты бинарников.
2. Нет дженериков (кроме встроенных). Меня это очень печалит. Отсюда следующий пункт
3. Приходится писать много бойлерплейта для типичных структур данных и алгоритмов. Это очень уныло.
4. Код, использующий гошные интерфейсы, ощутимо сливают по производительности коду, не использующему интерфейсов.
3.14159265 02.06.2014 11:28 # 0
За пару дней освоил. Помесь сишки, жабы и возможно ерланга (стрелочки), только с выпилом тонн ненужного синтаксиса.
> Нет дженериков (кроме встроенных).
Это наверное самое отстойное. Даже в сишке новой какие-то препроцессорные делают.
3.14159265 02.06.2014 11:40 # 0
Понятно что на говнокоде это не нужно. Но из того что понравилось. Сделали как надо - поменяли обратно местами тип и переменную, очень интересное наследование, типы мечты: int8,int16, float32, нормальный свич, интересная концепция туплов и связанная с ней обработка ошибок (сразу подумал что Тарасу такое оценит), из жабы взяли только самое необходимое пакеты, импорты, интерфейсы - кучу жавовских и крестоблядскийх ключевых слов (private,protected,public) оставили.
Из того что спорно, или я пока не въехал
Убрали из бинарного отрицания тильду ~ и сделали ^, логика определенная в этом есть, но не совсем понятно нахрена - теперь сложнее байтоебские коды портировать. А еще мне ^ никогда не нравился как xor.
finally вернее defer какой-то странный
laMer007 02.06.2014 14:52 # 0