backendGo Lang стремительно развивается в области backend-разработки. Все больше разработчиков пишут серверный код для облачных сред на Go и используют его в современных микросервисных архитектурах.
Краткий обзор Go: ключевые особенности языка - часть 1
В Go всего 25 ключевых слов (keywords, если что)!

Основные ключевые слова
var, const, type, struct - базовые.
const greeting = "Hello" var count int = 0 a := 10 // статическая типизация, тип определяется как int := имеет особое значение — сокращенная запись для объявления и определенияНет необходимости использовать var для инициализации переменной.
В Go нет ключевых слов вроде int, int64, bool, boolean и т.д. Они существуют как встроенные типы, но не как основные ключевые слова языка.
Объединение import и переменных
import ( "fmt" "os" "net" ) // аналогично можно объединять объявления var или const var ( a , b int = 3 , 7 name string = "Donald Trump" )Управляющие конструкции
Нет while, нет do..while! Есть только for / range и goto. Спокойно - да, goto здесь есть. Спасибо Google за это. Можно любить или ненавидеть - мы не будем занимать сторону :)
nums := [10]int{10, 20, 30,40,50,60,70,80,90,108} // объявление и инициализация массива fmt.Println("Iterating over nums with range:") for i, num := range nums { // ключевое слово range fmt.Printf("Index %d: Value %d\n", i, num) // похоже на C/C++? if i == 3 { continue } if i == 5 { break // выход из цикла при i == 5 } }select, switch, fallthrough используются для управления логикой ветвления.
count := 2 switch count { case 0, 1: fmt.Println("Count is 0 or 1") // break по умолчанию в Go, в отличие от C/C++/Java case 2: fallthrough // переход к следующему case case 3: fmt.Println("Count is 2 or 3") // выполнится default: fmt.Println("Count is something else") }В C / C++ / Java fallthrough - поведение по умолчанию, и требуется явно писать break.
В Go наоборот - break по умолчанию, а для продолжения используется fallthrough.
chan и make

В Go нет потоков уровня ОС. Вместо этого используются горутины - легковесные аналоги потоков.
chan (канал) - это своего рода канал передачи данных между горутинами.
ch := make(chan int) // отправка значения в канал (стрелка справа) ch <- 42 // получение значения (стрелка слева) value := <-ch // получение с проверкой value, ok := <-ch // немного странно? Go поддерживает множественные значения слева if !ok { fmt.Println("Channel is closed") } // закрытие канала close(ch)Горутины и каналы в действии
ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(1 * time.Second) ch1 <- "Message from channel 1" }() go func() { time.Sleep(2 * time.Second) ch2 <- "Message from channel 2" }() // select ожидает первый готовый канал select { // аналог switch, но для каналов case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) case <-time.After(3 * time.Second): fmt.Println("Timeout!") }backend
// разные способы инициализации - все с индекса 0 fruits := [3]string{"apple", "banana", "orange"} colors := [...]string{"red", "green", "blue"} // размер определяется автоматически mixed := [5]int{0: 10, 2: 30, 4: 50} // разреженная инициализация [10,0,30,0,50]Конструкторы с префиксом New
func NewUser(name string) *User { return &User{ ID: generateID(), // вспомогательная функция генерации ID Name: name, Email: "", // пустой email CreatedAt: time.Now(), IsActive: true, } } func NewUserWithEmail(name, email string) *User { return &User{ ID: generateID(), Name: name, Email: email, CreatedAt: time.Now(), IsActive: true, } } func NewUserFromID(id int) *User { // в реальном приложении здесь был бы запрос к базе данных userData := fetchUserFromDatabase(id) if userData == nil { return nil // пользователь не найден } return &User{ ID: id, Name: userData.Name, Email: userData.Email, CreatedAt: userData.CreatedAt, IsActive: userData.IsActive, } }Указатели в Go
Да, в Go есть указатели, но в более безопасной форме по сравнению с C/C++.
Указатели не поддерживают арифметику.
// Предполагается, что структура User уже существует type User struct { Name string Age int } // Вариант 1 var UserObject User = User{Name: "John", Age: 30} var pointerVar2 *User = &UserObject // Вариант 2 UserObject := User{Name: "John", Age: 30} pointerVar2 := &UserObject // Вариант 3 pointerVar2 := &User{Name: "John", Age: 30} // Вариант 4 pointerVar2 := new(User) *pointerVar2 = User{Name: "John", Age: 30}Если хотите глубже разобраться в языке и практике его применения в backend-разработке, можно изучить курс по Go программированию, где подробно разбираются реальные кейсы и архитектура сервисов.
