Функции в Go объявляются через ключевое слово func
:
func multiply(x int, y int) int {
return x * y
}
Объявление функции состоит из следующих частей:
— ключевое слово func
— название функции multiply
— входящие аргументы (x int, y int)
. Тип аргументов пишется после названия переменной. Если несколько аргументов подряд имеют одинаковый тип, то можно написать сокращенно (x, y int)
— тип возвращаемого значения int
— тело функции { return x * y }
Функции именуются в camelCase
. Если первая буква заглавная, то функция экспортируемая (публичная) и доступна в других пакетах. Функции с маленькой буквы используются только в рамках текущего пакета:
package math
// публичная функция, можно вызвать извне как math.Multiply(5,7)
func Multiply(x int, y int) int {
// ...
}
// приватная функция, извне не вызвать
func divide(x int, y int) int {
// ...
}
Из одной функции можно возвращать несколько значений. Чаще всего это используется для возвращения ошибок:
package math
import "errors"
func divide(x, y int) (int, error) {
if y == 0 {
return 0, errors.New("cannot divide on zero")
}
return x / y, nil
}
Возвращаемые значения могут быть именованными:
func multiply(x, y int) (res int) {
res = x * y
return
}
Использовать именованные возвращаемые аргументы — плохая практика. На это есть несколько причин:
— увеличенное расстояние между объявлением и использованием переменной ведет к сложности в чтении и понимании кода
— переменная может быть несколько раз переопределена в теле функции, что приводит к неожиданному поведению
— пустой return
неявно возвращает аргументы
Естественно, код состоит не только из функций: чаще всего используется множество внешних библиотек. Чтобы использовать внешнюю функцию, нужно указать пакет и через .
вызвать публичную функцию. Например:
import "fmt"
func myPrint(msg string) {
// пакет.функция
fmt.Println(msg)
}
В Go есть стандартная библиотека strconv
для конвертации чисел в строки и наоборот. Пример использования:
s := strconv.Itoa(-42) // "-42"
Напишите функцию IntToString, которая преобразует и возвращает входящее число в строку
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт
Ваше упражнение проверяется по этим тестам
1package solution
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7)
8
9func TestIntToString(t *testing.T) {
10 a := assert.New(t)
11 a.Equal("0", IntToString(0))
12 a.Equal("-42", IntToString(-42))
13 a.Equal("100500", IntToString(100500))
14}
15
Решение учителя откроется через: