Comments 30
Python не требует специфической иерархии каталогов
Вы уверены? Модули же надо как-то организовывать.
Даже больше того, на мой взгляд, в Go нет толковых и действительно необходимых фреймворков.
И, кстати, в Go слабая типизация, как и в Си. (Но статическая, да)
Такой код на Go не скомпилируется:
package main
type A int
type B int
func main() {
var a A
var b B
a = 1
b = a
}
Вылетит ошибка
cannot use a (type A) as type B in assignment
А такой код на Си не выведет даже warning'а (в последнем gcc). Даже с -Wall и -Wextra:
typedef int A;
typedef int B;
int main( void )
{
A a;
B b;
a = 1;
b = a;
}
Для программиста это всё явно не видно и с помощью кода вряд ли можно продемонстрировать.
В Go слабая статическая типизация. В Python типизация динамическая (слабая или сильная — не знаю).
P.S. В Python считается, что строгая типизация (насколько она может быть строгой в динамически типизированном языке).
Сильная/строгая (strong) и слабая (weak) типизации — это про явное и неявное приведение типов. У Go строгая типизация, так как приведение типов всегда явное.
Касательно информации от разработчика Go, то подозреваю, что имеется в виду этот известный комментарий от Ian Taylor. Увы, но в нём речь идёт не о типизации (typing), но о системе типов (type system). Понятия хоть и связанные, но все же разные. Слабая система типов Go выражается в том, что шаг вправо/влево, и уже приходится чертыхаться с interface{}
, теряя гарантии проверки корректности типов на этапе компиляции (ошибка несоответствия типа выстрелит только во время выполнения). И Ian Taylor сообщает, что это как раз сделано намеренно, дабы программисты "писали код, а не типы".
Ну вот в brainfuck, к примеру, программисты как раз и пишут "код", а не функции =)
Я понимаю вашу позицию, я и сам её сторонник. Но разработчики Go спроектировали язык именно так под свои задачи. Им надо именно такой трейд-офф. Нам лишь остаётся либо пользоваться этим инструментом, либо выбрать другой. Каждый сам решает.
package main
type A int
type B int
func main() {
var a A
var b B
var i int = 3
a = 1
b = 1
a = i
println(a)
println(b)
}
cannot use i (type int) as type A in assignment
Go пошёл не только от Си:
Go's heritage is at least as much Oberon as it is C!
Вот в этой книге см. 13 страницу.
И Go изначально задумывался сильно-типизированным:
essentially strongly typed, but probably w/ support for runtime types
package main
import "fmt"
type A [1]int
func main() {
var a A
i := [1]int{3}
a = i
fmt.Println(a)
fmt.Println(i)
}
[3]
[3]
И из не приведенных примеров, в Go нельзя без явного приведения типов смешивать очень близкие типы, например сложить байт и инт, или знаковое с беззнаковым.
Это непривычно первое время, но защищает от ошибок и позволяет делать удобные вещи типа 5*time.Second (имеющий тип).
Все же считаю Go языком со строгой типизацией, в отличие от C.
Нативный параллелизм
В оригинале
Native concurrency
И это важно потому что:
Concurrency is not parallelism
Вот еще линк для раздумий на тему
Может автор изначально ошибся в языке?
Мне всегда казалось, что сложную бизнес логику пишут на Java или C#. Тогда как Python больше про скорость разработки для стартапов и науки. Мимо этого заблуждения ещё можно пройти.
Но записать Go в скриптовые языки (да даже в статье упоминаются статическая типизация и компиляция)! Это на грани добра и зла.
Запускать можно go run — одной командой. Модуль OS имеется.
Причём она очень забавно сделана: если в других системах сборки либо всё декларативно и иногда что-то очень сложно сделать, то тут — есть дуализм. С одной стороны есть достаточно простой декларативный формат Android.bp, с другой — если нужно что-то хитрое, то можно дописать модуль на Go в soong.
Разумеется при изменении и того и другого всё, прозрачно для пользователя, пересобирается и перезапускается… чем не скрипт?
Вот для небольшой и выразительной математики да, лучше Python, из-за его сишных библиотек и особенностей синтаксиса. Но что-то большое и сложное на нем писать странно.
у меня вопрос в тему:
люди добрые, а подскажите чем в go можно заменить pytest, django orm и django rest framework?
Мой путь от Python к Go — делюсь советами и ресурсами