Язык с «упором» на простоту синтаксиса, быструю компиляцию, многопоточность и хорошее сетевые возможности. На синтаксис языка повлияли Си, Pascal, Python, заметно влияние Java, Haskell(?).
Основы языка быстро учатся, программки легко пишутся, легко компилируются и кросс-компилируются для большого множества архитектур и платформ.
Хотя язык быстро развивается и сообщество программистов, использующих Go, стремительно растет, ресурсов для обучения на русском языке в сети не слишком много.
export GOROOT="$HOME/go" export GOPATH="$HOME/mygoprojects" export GOBIN="$HOME/mygoprojects/bin"
и в переменной $PATH:
PATH=$HOME/go/bin:$PATH"
package main import "fmt" func main() { fmt.Println("Hello, world!") }
Go использует оба типа комментариев в стиле Си: строчные (начинающиеся с // …) и блочные (/* … */). Строчный комментарий рассматривается компилятором как перевод строки. Блочный, располагающийся на одной строке — как пробел, на нескольких строках — как перевод строки.
bool — тип логических значений (true
и false
), поддерживаются логические операции !
, &&
, ||
.
int, int8, int16, int32, int64 – число указывает сколько бит используется для представления типа. Тип int является машинно-зависимым, его размер зависит от архитектуры используемого компьютера.
uint, uint8, uint16, uint32, uint64 – число указывает сколько бит используется для представления типа. Тип uint является машинно-зависимым, его размер зависит от архитектуры используемого компьютера.
float32, float64 – число указывает сколько бит используется для представления типа.
byte, rune
Полная форма задания переменных выглядит примерно так:
var x float64 = 1.234
Значения можно присвоить и позже, более того, при определении переменной будет проведена инициализация в нулевое (для данного типа данных) значение
var x float64 print (x) +0.000000e+000
Но так как поддерживается динамическая типизация, то можно, наоборот, присвоить значение и тип будет выведен:
var x = 1.234 print (x) +1.234000e+000
или даже проще (как присваивание в Pascal'е):
x := 1.234 print (x) +1.234000e+000
Структуры — с одной стороны напоминают таковые в Си, с другой, вместе с методами, — это возможность некоторой разновидности (или подобия ООП) в языке Go.
Рассмотрим на примере. Создадим простейшую структуру, описывающую ученика ФМШ:
type pupil struct { name string lastname string age int32 height float32 weight float32 group int32 }
Определить новую переменную данного типа можно и объявлением:
var dima pupil
(поля будут инициализированы нулями и пустыми строками), можно сделать более java-образно, с созданием указателя:
var dima = new(pupil)
(об указателях, в другой раз). Но можно сделать инициализацию в стиле Go:
dima := pupil{name: "Dima", group: 412}
(пропущенные поля вновь будут инициализированы нулями)
Теперь к свойствам можно обращаться в ООП-стиле:
fmt.Println(dima.name, dima.group)
Методы, если мы хотим их использовать как в ООП, задаются немного хитрее, нежели свойства-поля. Вот, попробуем вычислить «гармоническое телосложение» по формуле Брока
func (p pupil) habitus() float32 { return ((p.height - 110) - p.weight) }
После ключевого слова 'func' мы видим «получателя», т.е. задаем тип, с которым будем работать наш метод. Тогда для школьника dima мы можем сделать проверку телосложения:
dima := pupil{name: "Dima", group: 412, heigh: 170, weight: 68} fmt.Println(dima.name, dima.habitus())
package main func main() { print("Hello", " world!"); }
Тем не менее, стандартным способом вывода считается такая конструкция:
package main import "fmt" func main() { x := 3.1415 fmt.Println("pi=", x) }
package main import "fmt" func main() { var s string var i int if _, err := fmt.Scan(&s, &i); err == nil && i == 75000 { fmt.Println("good") } else { fmt.Println("wrong") } }
для чтения строки можно использовать fmt.Scanln
Используется буфер!
Примеры взяты тут: Rosetta Code
На основе статей Writing Web Applications и частично Build Web Application with Golang, Network programming with Go.
Замечательная книга товарища astaxie в настоящий момент переводится на русский язык, и нужные нам главы уже доступны на русском: 4.1 Работа с формами
Пока, вот минимальный код:
package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
просто сохраняем (напр., servak.go) запускаем go run servak.go
и в браузере пробуем увидеть ответ по адресу http://127.0.0.1:8080/anything