Shaman
Это детская ошибка, конечно же она от незнания языка и вызывает только умилительную улыбку.
Там многое надо в голове держать, такая ошибка получается не тогда, когда он сразу пишет, а тогда, когда он сначала на массиве делает, а потом, спустя какое-то время, решает заменить массив на указатель, а эту операцию забывает изменить следом. Поэтому нужно знать ещё все такие случаи, а это вырабатывается только со временем, когда понаступаешь на такие грабли. И только знание стандарта спасёт тебя от того, чтобы потом постоянно не сидеть в отладчике в своей же программе.
Shaman
В том же C++ гораздо менее очевидных тонкостей на порядки больше.
Там всё хуже, потому что сам язык хуже. То есть он должен был быть лучше, по идее, но получилось только хуже всё. Если брать аппарат операций, то в сишнике он понятный и простой и при этом мощный. В C++ же его стали менять и превратили в итоге в кашу-малашу - то есть ты его уже учить заманаешься, потому что он нелогичный какой-то. Или вот я всегда привожу в пример встроенные типы составные (список, очередь и подобные), ими никогда нельзя пользоваться сходу (как в питоне, например), их надо обязательно дописывать. В итоге, они как бы есть, но их как бы и нет. В питоне-то у тебя всё есть, в сишнике надо всё писать, а тут ни то ни сё. Да, и стандарт ты никогда весь не прочитаешь, потому что он большой, часто меняется, и там много лишнего, вообще в языке много лишнего. Сегодня что-то вводят, через год это же отменяют нафиг. Потом они ещё само ядро языка меняют, добавляя дубликаты конструкций. Вот поэтому сам питон классический на C сделан, а не на C++. В C меньше заморочек, учится он быстрее в несколько раз, и он не меняется каждый день.
По ядру языка Go не плох, но он плох в другом. То есть ядро языка, вообще, хорошо сделано. Например, когда все три сишных цикла for, while и do…while сведены к одному циклу for. Или там умный switch, у которого умные case'ы, в них там можно функции вызывать, да ещё эти функции могут быть анонимными. Но вот то, что мне для маленькой программки нужно тратить полтора мегабайта, ни с того ни с сего причём, или что там нет нормальной модели ООП, как в питоне, где можно нормально наследоваться, ничего не выдумывая, это его, конечно, полностью нивелирует. Просто коммерческий проект, какие-то вещи продуманы отлично, какие-то вещи не продуманы вообще (или просто не проделаны из-за какой-то гонки внутри компании). Мне вот надо программу сделать, она будет не больше 100Kb, да меньше даже, так вот на Go я её сделать не могу, потому что она получится 10Mb. Я вот хочу, допустим, пакет программ сделать небольших, я на C спокойно его сделаю, а на Go он займёт там полдиска (образно выражаясь), просто так, тогда как на C он займёт 100Kb, потому что все программы маленькие.
Вот программы 125Kb 53Kb 151Kb 76Kb 556Kb
[guest@localhost ~]$ ll /bin/ls
-rwxr-xr-x. 1 root root 125372 авг 15 2013 /bin/ls
[guest@localhost ~]$ ll /bin/cat
-rwxr-xr-x. 1 root root 53316 авг 15 2013 /bin/cat
[guest@localhost ~]$ ll /bin/grep
-rwxr-xr-x. 1 root root 151120 окт 29 2013 /bin/grep
[guest@localhost ~]$ ll /bin/sed
-rwxr-xr-x. 1 root root 76384 авг 5 2013 /bin/sed
[guest@localhost ~]$ ll /bin/gawk
-rwxr-xr-x. 1 root root 556588 авг 4 2013 /bin/gawk
[guest@localhost ~]$
Вот они все вместе весят в пределах мегабайта, причём ими можно дофига чего сделать. А в Go то же самое будет весить 100Mb просто так, по желанию авторов, потому что они там что-то считают.
Так что из этих трёх языков - C, C++, Go - C лучше всего подходит для быстрой, экономной и надёжной разработки.