Go
Материал из Xgu.ru
Go — язык программирования со статической типизацией, синтаксически отдалённо напоминающий Си, обладающий рядом интересных особенностей, в частности удобными механизмами для написания конкурентных программ, такими как горутины (goroutines), каналы и проч. Компилируется в машинный код. Есть поддержка LLVM.
Есть два компилятора Go:
- gc, основной компилятор;
- GCC, который поддерживает компиляцию Go в код любой платформы, которую поддерживает GCC.
[править] Возможности Go
Что есть в Go?
- сборщик мусора (garbage collection);
- система управления пакетами (package management);
- функции первого класса;
- лексическая область видимости;
- интерфейс системных вызовов;
- неизменяемые строки (immutable strings) в UTF-8.
[править] Возможности, которых нет в Go
Чего нет в Go?
- Неявного преобразования типов чисел;
- Нет конструкторов и деструкторов;
- Нет перегрузки операторов (operator overloading);
- Нет значений параметров по умолчанию (default parameter values);
- Нет наследования;
- Нет обобщений (generics);
- Нет исключений (exceptions);
- Нет макросов;
- Нет аннотаций функций;
- Нет локальной памяти нитей (thread local storage).
С точки зрения авторов языка это преимущество языка, поскольку он не перегружен деталями и позволяет обходиться небольшим числом понятий.
[править] Проекты на Go
Несколько интересных проектов, написанных на Go:
Кроме того, Go активно используют Dropbox, Heroku, Github, BBC, Sondcloud.
[править] Реализации
- gopherjs — компилятор Go в JavaScript, позволяет исполнять код Go в браузере
[править] Вопросы и ответы
[править] Как удалить определённые символы слева и справа в строке, аналог strip в Python?
strings.Trim(" Achtung ", " ")
[править] Как разбить строку на подстроки, аналог split в Python?
strings.Split(string(content), "\n")
[править] Как проверить строку на соответствие регулярному выражению?
r, err := regexp.Compile(`\.`) if r.MatchString("Short.") == true { fmt.Printf("Has a dot.") // <--- } else { fmt.Printf("Has no dot.") }
[править] Как прочитать файл построчно?
Использовать Scanner из bufio:
file, err := os.Open("/path/to/file.csv") if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal(err) }
[править] Как пройтись по массиву и выполнить какое-то действие с каждым его элементом?
var total float64 = 0 for i, value := range x { total += value }
[править] Как прочитать файл?
func check(e error) { if e != nil { panic(e) } } func main() { dat, err := ioutil.ReadFile("/tmp/dat") check(err) fmt.Print(string(dat)) }
[править] Что можно делать со слайсами?
В принципе, плюс-минус то же, что в Python со списками.
Подробнее: SliceTricks .
[править] Дополнительная информация
- Tour of Go (англ.) — интерактивный учебник-введение в Go, может использоваться как прекрасный способ погрузиться в язык
Критика Go:
- Rust vs Go (англ.), Go безбожно проигрывает
- Why Go Is Not Good (англ.)
- How do Go and Rust languages compare? , Costya Perepelitsa