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