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
