Бесплатный курс по Go. Зарегистрируйтесь для отслеживания прогресса →

Go: Математика и числа

В Go представлено много числовых типов данных: uint, uint8, uint16, uint32, uint64, int, int8, int16, int32, int64, float32, float64, complex64, complex128. Зачем же столько типов для чисел? Одна из главных особенностей Go — это кроссплатформенность. Пишется один код, который компилируется и запускается на любой архитектуре процессора. В своем коде предпочтительнее использовать int и uint, так как они являются архитектурно-независимыми: в момент компиляции принимают значение 32 или 64 битов под процессор.

На самом деле вам не нужно запоминать все эти типы. В ежедневной работе вы будете сталкиваться с:
- int — основной кросплатформенный тип целых чисел, может быть отрицательным
- int64 нужен для больших чисел из внешних систем. Например, ID в СУБД имеет тип bigint. Чтобы правильно распарсить такой ID, используется int64
- float64 — число с плавающей точкой. Чаще всего используются для математических операций. Например, функция math.Max, определяющая наибольшее число, принимает аргументы в виде float64

В Go имеется стандартный набор арифметических операций:

x := 10
y := 5

// сложение
x + y // 15

// вычитание
x - y // 5

// деление
x / y // 2

// умножение
x * y // 50

Любые операции осуществляются только над числами одинакового типа:

x := 5.05
y := 10

x + y  // invalid operation: x + y (mismatched types float64 and int)

Чтобы осуществить сложение из прошлого примера, нам нужно конвертировать значения к одному типу

x := 5.05
y := 10

x + float64(y)  // 15.05

Числовые типы конвертируются без проблем между собой, однако есть нюансы, о которых стоит помнить:

// нельзя конвертировать float64 к целому числу, если после точки не только нули
x := int64(5.05) // ошибка компиляции: constant 5.05 truncated to integer

x := int64(5.00) // OK

// uint не может быть отрицательным
x := uint(-5) // constant -5 overflows uint

Приведенные выше примеры вызовут ошибки компиляции, поэтому вам не удастся «выстрелить себе в ногу». Однако существуют способы обмануть компилятор, и тогда вы получите неявное поведение в коде:

a, _ := strconv.Atoi("-42")

// ошибки компиляции нет, но число было преобразовано в положительное путем прибавления MAX_UINT+1. MAX_UINT = 18446744073709551615
x := uint(a) // 18446744073709551574

a, _ := strconv.Atoi("5.05")

// ошибки компиляции нет, но значение всегда будет равно 0
x := int(a) // 0

Задание

В уроке упоминалась функция math.Max, которая сравнивает два числа и возвращает наибольшее. В этом задании следует использовать противоположную функцию math.Min, определяющую наименьшее число.
Напишите функцию MinInt(x, y int) int, которая возвращает наименьшее целое число

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе