Полное руководство по основам языка Go

Это подробное руководство по основам языка Go, включающее примеры программ, которые демонстрируют различные концепции программирования на Go.

Назад

Первая программа на Go

Каждая программа на Go начинается с функции main:


package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
        

Типы данных

Основные типы данных в Go:

Арифметические операции

Пример использования арифметических операций в Go:


package main

import "fmt"

func main() {
    a := 10
    b := 20
    sum := a + b
    diff := b - a
    prod := a * b
    div := b / a
    mod := b % a

    fmt.Println("Sum:", sum)
    fmt.Println("Difference:", diff)
    fmt.Println("Product:", prod)
    fmt.Println("Division:", div)
    fmt.Println("Modulus:", mod)
}
        

Ввод/Вывод

Ввод и вывод данных с использованием fmt.Scan и fmt.Println:


package main

import (
    "fmt"
)

func main() {
    var num int
    fmt.Print("Enter an integer: ")
    fmt.Scan(&num)
    fmt.Println("You entered:", num)
}
        

Условные операторы

Пример использования оператора if-else:


package main

import (
    "fmt"
)

func main() {
    var num int
    fmt.Print("Enter an integer: ")
    fmt.Scan(&num)

    if num > 0 {
        fmt.Println("The number is positive.")
    } else if num < 0 {
        fmt.Println("The number is negative.")
    } else {
        fmt.Println("The number is zero.")
    }
}
        

Циклы

Пример цикла for:


package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("i =", i)
    }
}
        

Массивы

Пример работы с массивами:


package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}

    for i, value := range arr {
        fmt.Println("arr[", i, "] =", value)
    }
}
        

Функции

Пример создания и использования функции:


package main

import "fmt"

func greet() {
    fmt.Println("Hello from the function!")
}

func main() {
    greet()
}
        

Структуры

Пример создания и использования структур:


package main

import "fmt"

type Rectangle struct {
    width  float64
    height float64
}

func (r Rectangle) area() float64 {
    return r.width * r.height
}

func (r Rectangle) display() {
    fmt.Printf("Width: %.2f, Height: %.2f, Area: %.2f\n", r.width, r.height, r.area())
}

func main() {
    rect := Rectangle{width: 5.0, height: 3.0}
    rect.display()
}
        

Наследование

В Go нет классического наследования, но можно использовать композицию:


package main

import "fmt"

type Animal struct {
    name string
}

func (a Animal) speak() {
    fmt.Println(a.name, "makes a sound.")
}

type Dog struct {
    Animal
}

func (d Dog) speak() {
    fmt.Println(d.name, "barks.")
}

func main() {
    dog := Dog{Animal{name: "Rex"}}
    dog.speak()
}
        

Указатели

Пример работы с указателями:


package main

import "fmt"

func main() {
    num := 10
    ptr := &num

    fmt.Println("Value of num:", num)
    fmt.Println("Value via pointer:", *ptr)
}
        

Динамическое выделение памяти

В Go нет прямого управления динамической памятью, используется сборщик мусора:


package main

import "fmt"

func main() {
    num := new(int)
    *num = 10

    fmt.Println("Value:", *num)
}
        

Работа с коллекциями

Пример работы с коллекциями в Go:


package main

import "fmt"

func main() {
    list := []string{"Hello", "World"}

    for _, item := range list {
        fmt.Println(item)
    }
}
        

Обработка ошибок

Пример обработки ошибок в Go:


package main

import (
    "errors"
    "fmt"
)

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }

    result, err = divide(10, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}
        

Работа с файлами

Пример работы с файлами в Go:


package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    err := ioutil.WriteFile("example.txt", []byte("Hello, file!"), 0644)
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }

    data, err := ioutil.ReadFile("example.txt")
    if err != nil {
        fmt.Println("Error reading file:", err)
        return
    }
    fmt.Println(string(data))
}