Разберем программу Hello world из предыдущего урока:
// Определение пакета main
package main
// Импорт пакета fmt
import "fmt"
// Определение функции main
func main() {
// Вызов функции Print из пакета fmt
// Отступ 1 таб
fmt.Print("Hello, World!") // В конце не нужна точка с запятой
}
Сначала мы определили пакет main
:
package main
Пакеты выполняют роль неймспейсов (логически обособленные директории с локальным именованием) и используются для группировки функций. Все Go-файлы начинаются с объявления пакета, к которому они относятся. Внутри одного пакета может быть множество функций.
После определения пакета мы написали функцию main
. В ней описана вся логика программы:
func main() {
...
}
main
— главная функция, которая выполняется при запуске любой Go-программы и является точкой входа в программу. Она не может принимать или возвращать какие-либо аргументы.
Чтобы вывести строку в терминал, мы использовали внешний пакет fmt
:
import "fmt"
Импорт сторонних пакетов описывается словом import
. Блок импортов располагается в начале Go-файла сразу после названия пакета.
После импорта мы можем вызывать функции пакета в своем коде.
fmt.Print("Hello, World!")
Сторонний пакет — это не объект, а неймспейс. Его можно использовать только как префикс к функциям. Обратиться к функции стороннего пакета можно через точку. Функции, как и во многих языках (например, Java, PHP, Python), вызываются через скобки и передачу аргумента внутрь.
Вы могли обратить внимание, что функция Print
написана с большой буквы, а main
— с маленькой. В Go функция публична, если ее первая буква заглавная. Публичность или экспортируемость означает, что мы можем использовать эту функцию в других пакетах. С другой стороны, если функция начинается с маленькой буквы, то она является приватной и может использоваться только внутри пакета. Функция fmt.Print
— публичная, поэтому мы можем вызывать ее в своем коде. А функция main
— приватная, она доступна только в рамках нашего пакета main
.
Рассмотрим аргумент "Hello, World!"
. Строки практически всегда объявляются в двойных кавычках. Существует еще один способ описать многострочную строку через обратную кавычку `, но он используется в исключительных ситуациях. Мы пока будем использовать только двойные.
Одной из особенностей языка Go является отсутствие точек с запятыми. Чтобы компилятор понял код, необходимы правильные переносы строк и отступы: табами, а не пробелами. В работе это не доставляет больших неудобств, поскольку в языке есть встроенная тулза для форматирования кода. Ссылка на тулзу лежит в разделе Полезное
в конце урока.
Напишите функцию main
, которая выводит на экран строчку "Hello, Friend!".
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1package main
2
3import (
4 "fmt"
5 "log"
6 "os/exec"
7 "testing"
8)
9
10func TestHelloWorld(t *testing.T) {
11 cmd := exec.Command("go", "run", "solution.go")
12 out, err := cmd.CombinedOutput()
13 if err != nil {
14 log.Fatalf("error on running the command: %v\n", err)
15 }
16 fmt.Println(string(out))
17 // Output:
18 // Hello, Friend!
19}
20
Решение учителя откроется через: