Основные команды и VSCode
Необходимо создать директорию для Go-окружения и добавить путь к ней в переменные среды. ```go $ go mode init my-app // создание файла go.mod для отладки и запуска $ go run main.go // запуск приложения $ go build -o my.exe main.go // создание исполняемого файла $ go get -t github.com/... // скачать и добавить библиотеку ```
Точка входа в приложение:
```go func main() { } ```
Типы данных:
```go var a int8, uint8 var b int16, uint16 var c int32, uint32 var d int64, uint64 var e byte // = uint8 var f rune // int32 var j int // var k uint var a float32 var b float64 var x complex64 var x complex128 var x bool = true var x bool = false var name string = "Dmitry" ```
Инициализация переменных:
```go var name string var name string = "Dmitry" name := "Dmitry" var ( name = "Dmitry" age = 32 ) var name, age = "Dmitry", 32 ```
Функции:
```go // Функция может возвращать несколько значений func test() (string, string) { a := "hello" b := "world" return a, b } // Именные выходные параметры // В данном случае выходные переменные уже проинициализированы // Можно просто присваивать значения func test() (a string, b string) { a = "hello" b = "world" return a, b } // Получить значения s1, s2 := test() // Или одно func test() string { return "empty" } // Передать функцию как параметр func test(callback func(int, int) int, s string) int { result := callback(5, 1) fmt.Println(s) return result } ```
Структуры
```go type Point struct { X int Y int } p := Point { X: 1, Y: 2, } p.X = 123 // добавить метод к структуре func (p *Point) movePointPtr(x, y int) { p.X += x p.Y += y } ```
Массивы и срезы
Срезы не имеют фиксированной длины. Слайсы не хранят данные, а ссылаются на массив. ```go var a[2]string a[0] = "hello" a[1] = "world" // Компилятор посчитает размер массива nmbers := [...]int{1, 2, 3} // Слайсы. Не имеют фиксированной длины letters := []string{"a", "b", "c"}     // Пустой слайс createSlice := make([]string, 3)     ```
Циклы
```go // Обычная запись sum := 0 for i := 0; i < 10; i++ { sum += i } // Цикл с условием sum := 0 for ; sum < 1000 { sum += 10 } // Более короткая запись sum := 0 for sum < 1000 { sum += 10 } ```
Ветвление
```go if a < 1000 { } else if { } else { } // Сокращенная запись if i := isTest(): i == 1 { } // switch i { case 1: case 2: case 3: default: } // Короткая запись switch i := isTest() { } // switch можно записать без условия switch { case i == 1: // true/false case i == 2: } ```
Отложенное выполнение
```go // несколько defer выполняются по принципу стека func main() { defer fmt.Println("world") // Вызвов будет после fmt.Println("Hello") } ```
Ссылки и указатели
```go a := "hellow world" p := &a // ссылка fmt.Printlt(*p) // * получить значение (hello world) *p = "new string" fmt.Printlt(*p) // * получить значение (new string) ```
Замыкание
```go func totalPrice(initPrice int) func(int) int { sum := initPrice return func(x int) int { sum += x return sum } } func main() { orderPrice := totalPrice(1) fmt.Println(orderPrice(1)) fmt.Println(orderPrice(1)) fmt.Println(orderPrice(1)) fmt.Println(orderPrice(1)) } ```
Итератор range. Структура map
```go func test6() {     arr := []string{"a", "b", "c"}     for i, l := range arr {         fmt.Println(i, l)     } } func test7() {     pointMap := map[string]Point{}     // otherMap := map[string]int{}     // otherPointMap := make(map[int]Point)     pointMap["a"] = Point{         X: 1,         Y: 2,     }     fmt.Println(pointMap)     fmt.Println(pointMap["a"]) } ```