Язык Go и зачем нужен был ещё один язык

от
Прочие языки    golang

Хочу рассказать вам об относительно новом языке Go. Также часто называемый Golang. Искать что-нибудь в интернете нужно искать с приставкой golang, иначе всякие сайты про CS:GO будут))

Ой. Ну короче. Языку Go - 5 лет. Молодой язык взял свое начало в недрах Google. Разработчики языка Си и Unix (Кен Томпсон) и Роб Пайк задумались, а каким должен быть хороший язык программирования. Здесь они решили, что язык будет компилируемый и главной фичей языка будет многопоточность и отдельный синтаксический сахар для потоков и каналов. Почему они так сделали? В текущих реалиях мощности компьютера увеличиваются а программы все еще работают в одном потоке. Нужно было это как-то исправить.

Об остальных фичах коротко - статическая типизация, сборщик мусора, упрощенный ооп (его почти нет) с интерфейсами и структурами (которым можно объявлять функции или методы). Хочу остановиться на последнем:
  1. // объявление своего типа (alias)
  2. package main // запускаемое приложение
  3. // должно быть объявлено с пакетом main
  4.  
  5. type Vector [3]float64
  6.  
  7. // псевдо-конструктор
  8. func NewVector(x, y, z float64) *Vector {
  9.   // Создаем объект и берем его адрес
  10.   return &Vector{x, y, z}
  11. }
  12.  
  13. // функция вектора
  14. func (v *Vector) Add(other *Vector) *Vector {
  15.   return &Vector{v[0]+other[0], v[1]+other[1], v[2]+other[2]}
  16. }
  17.  
  18. // точка входа в приложение
  19. func main() {
  20.   var a *Vector
  21.   a = NewVector(2, 2, 2)
  22.   // короткое объявление
  23.   b := NewVector(1, 1, 1)
  24.   c := a.Add(b)
  25.   // вывод в консоль
  26.   fmt.Println(c)
  27. }
Сейчас конечно, вы этот код не запустите. Это просто пример синтаксиса. А если вы знакомы с языком и компилятор установлен:
  1. go run main.go // запуск
  2. go build -o main main.go // компиляция
Язык задумывался так, что не нужны никакие Makefile, Ant, Gradle. А также, чтобы скачать дополнительные библиотеки вам необходимо установить git (или cvs, смотря откуда код качаете), и установить библиотеку. К примеру, Go на Android и iOS (перед этим установить git):
  1. go get golang.org/x/mobile/cmd/gomobile
Тоесть, go get аналог ruby gem.

Вернемся к ООП, рассмотрим интерфесы:
  1. package io
  2. type Reader interface {
  3.   Read(b []byte) (int, error)
  4. }
  5.  
  6. type Writer interface {
  7.   Write(b []byte) (int, error)
  8. }
Вы наверное зададите вопрос - а что, можно возвращать несколько значений? Да, можно. Так как в языке нету try-catch, то многие функции в качестве второго значения возвращают ошибку. К примеру:
  1. var b []byte
  2. b = make([]byte, 16)
  3. n, err := os.Stdin.Read(b)
  4. if err != nil {
  5.   // возникла ошибка
  6.   panic(err)
  7. }
Да, иногда в коде очень много обработок ошибок. Причем, они немного портят код.
Так, если вы объявили интерфейс, то наверное хотите реализовать его, да? Реализация очень проста - объявляете этот метод в своем типе.
  1. type FileReader struct {
  2.   fd int
  3. }
  4.  
  5. func (fr *FileReader) Read(b []byte) (n int, err error) {
  6.   // читаем из файла
  7. }
Считайте, что вы реализовали интерфейс. А дальше вы можете использовать этот тип в других функция, которые принимают параметр io.Reader:
  1. fmt.Fprintln(myfilereader, "Hello world!")
Компилятор сам проверит все соответсвия и все сделает.

Сразу говорю - писать статьи я не умею. Так что вопросы и исправления этой разноненной информации в комментариях пишите! Возможно в следующий раз что-нибудь еще напишу!
  • +2
  • views 3080