Golang: Переменные
В Go переменные объявляются с помощью ключевого слова var:
var name string
name = "Hexlet"Переменной name задаётся имя и тип (string). Позже в неё можно присвоить значение. Объявление и присваивание можно объединить:
var name string = "Hexlet"После этого переменной можно присвоить другое значение того же типа:
name = "Code Basics"Go — строго типизированный язык, поэтому тип переменной фиксирован: если name объявлена как строка, в неё нельзя записать число или логическое значение.
Значения по умолчанию
Если переменную объявить без инициализации, она получит значение по умолчанию. Для строк это пустая строка, для чисел — ноль, для булевых значений — false.
var name string // ""
var count int // 0
var active bool // falseВывод типа
Если при объявлении переменной сразу указать значение, тип можно не писать — компилятор выведет его сам на основе переданного значения. Это упрощает запись, особенно когда тип очевиден:
var name = "Hexlet"
var count = 10 // int
var active = true // boolПри этом тип сохраняется за переменной, как если бы он был написан явно. В дальнейшем переменной можно присваивать только значения этого типа. Попытка записать значение другого типа приведёт к ошибке компиляции. Например, если name была строкой, то присваивать ей число нельзя.
Вывод типа работает только при одновременном объявлении и инициализации. Если вы просто пишете var city, без значения, то компилятор не сможет вывести тип и выдаст ошибку. В таких случаях тип нужно указывать явно:
var city // ошибка: тип не указан
var city string // правильноКраткая форма объявления
Внутри функций можно использовать сокращённую форму объявления переменной с помощью оператора :=:
name := "Hexlet"Эта форма позволяет одновременно создать переменную и присвоить ей значение. Тип по-прежнему выводится автоматически. Такой синтаксис упрощает запись и активно используется в Go-коде. Важно помнить, что := работает только внутри функций. Вне функции можно использовать только var.
С помощью := можно объявлять несколько переменных сразу:
name, course := "Hexlet", "Go"При этом типы обеих переменных будут выведены по значениям. Такой способ часто используется при обработке нескольких значений, например при возврате значений из функции.
Особенности
- Все переменные должны использоваться — иначе ошибка компиляции.
- Имя переменной нельзя использовать до её объявления.
Задание
Реализуйте функцию PrintBody(), которая:
- Создаёт переменную
nameсо значением"Go". - Создаёт переменные
languageиversionсо значениями"Go"и1.21соответственно, используя сокращённую форму объявления:=. - Выводит эти переменные на экран в одну строку через пробел, используя
fmt.Println().
Пример
Go Go 1.21Подсказка
Функция fmt.Println() может принимать несколько аргументов, разделяя их пробелами:
fmt.Println("Hello", "world", 2025)Полезное
Ваше упражнение проверяется по этим тестам
package solution
import (
"bytes"
"os"
"testing"
"github.com/stretchr/testify/assert"
)
func TestPrintBody(t *testing.T) {
// Создаём буфер и перенаправляем os.Stdout
var buf bytes.Buffer
old := os.Stdout
r, w, err := os.Pipe()
assert.NoError(t, err)
os.Stdout = w
// Вызываем тестируемую функцию
PrintBody()
// Закрываем запись и читаем вывод
err = w.Close()
assert.NoError(t, err)
os.Stdout = old
_, err = buf.ReadFrom(r)
assert.NoError(t, err)
expected := "Go Go 1.21\n"
assert.Equal(t, expected, buf.String(), "Вывод функции PrintBody не совпадает с ожидаемым")
}Решение учителя откроется через:
20:00
