Golang: Математика и числа
В Go существует множество числовых типов:
uint
,uint8
,uint16
,uint32
,uint64
int
,int8
,int16
,int32
,int64
float32
,float64
complex64
,complex128
Это связано с тем, что Go — кроссплатформенный язык. Один и тот же код компилируется под разные архитектуры — 32-битные и 64-битные. Поэтому язык предлагает как архитектурно-независимые типы (int
, uint
), так и строго фиксированные (int32
, uint64
и другие).
Практически используемые типы
В повседневной разработке чаще всего используются три типа:
int
— основной тип целых чисел. Может быть отрицательным. Разрядность зависит от архитектуры (32 или 64 бита).int64
— используется, когда требуется явно задать размер. Например, при работе сbigint
из баз данных.float64
— число с плавающей точкой двойной точности. Применяется в математических операциях и финансовых расчётах.
Арифметические операции
В Go поддерживаются базовые арифметические операции:
x := 10
y := 5
x + y // 15
x - y // 5
x * y // 50
x / y // 2
Операции возможны только между значениями одного и того же типа. Неявное приведение типов не выполняется. Пример ошибки:
x := 5.05
y := 10
x + y // ошибка: mismatched types float64 and int
Для выполнения операции нужно привести типы вручную:
x + float64(y) // 15.05
Сокращённые операции присваивания
Go поддерживает сокращённые операции изменения значения переменной:
count := 10
count += 5 // count = 15
count -= 3 // count = 12
count *= 2 // count = 24
count /= 4 // count = 6
Преобразования между типами
Конвертировать значения между числовыми типами можно, но с ограничениями:
x := int64(5.99) // округляется вниз → 5
x := int64(5.05) // ошибка компиляции: constant 5.05 truncated to integer
x := uint(-5) // ошибка компиляции: constant -5 overflows uint
Go не позволяет преобразовать значение, если оно может привести к потере данных на этапе компиляции.
Задание
Реализуйте функцию CalculateProgress()
, которая вычисляет, какую часть из целого составляет текущее значение. Это может использоваться, например, для отображения процента выполнения задачи или прогресса загрузки.
Функция принимает два аргумента:
done
— выполненное количество (int
)total
— общее количество (int
)
Возвращается результат деления в виде float64
.
Примеры
CalculateProgress(3, 4) // 0.75
CalculateProgress(2, 5) // 0.4
CalculateProgress(0, 10) // 0.0
CalculateProgress(5, 5) // 1.0
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
package solution
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestCalculateProgress(t *testing.T) {
a := assert.New(t)
a.InDelta(0.0, CalculateProgress(0, 10), 0.0001)
a.InDelta(0.25, CalculateProgress(1, 4), 0.0001)
a.InDelta(0.4, CalculateProgress(2, 5), 0.0001)
a.InDelta(0.75, CalculateProgress(3, 4), 0.0001)
a.InDelta(1.0, CalculateProgress(5, 5), 0.0001)
}
Решение учителя откроется через:
20:00
