Golang: Математика и числа
В Go существует множество числовых типов:
uint,uint8,uint16,uint32,uint64int,int8,int16,int32,int64float32,float64complex64,complex128
Последняя пара стоит особняком: 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 % y // 0Деление целых чисел даёт целое: дробная часть отбрасывается, а не округляется. Остаток от такого деления возвращает отдельный оператор %. Он определён только для целых типов, для float64 его нет:
7 / 2 // 3
7 % 2 // 1Операции возможны только между значениями одного и того же типа. Неявное приведение типов не выполняется. Пример ошибки:
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
count %= 4 // count = 2Преобразования между типами
Конвертировать значения между числовыми типами можно, но с ограничениями:
f := 5.99
x := int64(f) // округляется вниз → 5
y := int64(5.05) // ошибка компиляции: constant 5.05 truncated to integer
z := uint(-5) // ошибка компиляции: constant -5 overflows uintGo не позволяет преобразовать значение, если оно может привести к потере данных на этапе компиляции.
Задание
Реализуйте функцию 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Полезное
Golang: Математика и числа
В Go существует множество числовых типов:
uint,uint8,uint16,uint32,uint64int,int8,int16,int32,int64float32,float64complex64,complex128
Последняя пара стоит особняком: 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 % y // 0Деление целых чисел даёт целое: дробная часть отбрасывается, а не округляется. Остаток от такого деления возвращает отдельный оператор %. Он определён только для целых типов, для float64 его нет:
7 / 2 // 3
7 % 2 // 1Операции возможны только между значениями одного и того же типа. Неявное приведение типов не выполняется. Пример ошибки:
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
count %= 4 // count = 2Преобразования между типами
Конвертировать значения между числовыми типами можно, но с ограничениями:
f := 5.99
x := int64(f) // округляется вниз → 5
y := int64(5.05) // ошибка компиляции: constant 5.05 truncated to integer
z := uint(-5) // ошибка компиляции: constant -5 overflows uintGo не позволяет преобразовать значение, если оно может привести к потере данных на этапе компиляции.
Задание
Реализуйте функцию 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
