Числа используются повсюду в программировании. Они используются для представления таких вещей, как размеры экрана, географическое местоположение, денежные средства и баллы, количество времени, передаваемого в видео, расположение игровых аватаров, отображение цветов через присвоение числовых кодов и т. д.
Эффективное выполнение математических операций в программировании является важным навыком, который необходимо развивать, поскольку вы очень часто будете работать с числами. Хотя понимание математических операций на высоком уровне может помочь вам стать более профессиональным программистом, это не является обязательным условием. Если у вас нет опыта работы с математическими операциями, попробуйте посмотреть на математику как на инструмент, с помощью которого вы можете добиться того, чего хотите, и как на способ улучшить ваше логическое мышление.
Мы будем работать с двумя наиболее используемыми типами данных Go, int и float:
-1
,0
, 1
…).9,0
или -2,25
.В этом обучающем руководстве мы изучим операторы, которые мы можем использовать с числовыми типами данных в Go.
Оператор — это символ или функция, указывающая операцию. Например, в математике значок плюс или +
— это оператор сложения.
В Go мы увидим несколько похожих операторов, которые взяты из математики. Однако другие операторы, которые мы будем использовать, принадлежат только к компьютерному программированию.
Здесь вы можете найти таблицу с математическими операторами в Go. Мы рассмотрим все эти операторы в рамках данного руководства.
Операция | Что возвращает |
---|---|
x + y |
Сумма x и y |
x - y |
Разница между x и y |
-x |
Изменение знака x |
+x |
Тождественность x |
x * y |
Произведение x и y |
x / y |
Результат деления x на y |
x % y |
Остаток деления x на y |
Также мы рассмотрим составные операторы присваивания, включая +=
и *=
, которые совмещают арифметический оператор с оператором =
.
В Go операторы сложения и вычитания работают так же, как и в математике. По сути, вы можете использовать язык программирования Go как калькулятор.
Давайте рассмотрим несколько примеров, начиная с целых чисел:
fmt.Println(1 + 5)
Output6
Вместо передачи целых чисел прямо в оператор fmt.Println
мы можем инициализировать переменные для хранения целочисленных значений, используя следующий синтаксис:
a := 88
b := 103
fmt.Println(a + b)
Output191
Поскольку целые числа могут быть как положительными, так и отрицательными (как и 0), мы можем добавить отрицательное число к положительному:
c := -36
d := 25
fmt.Println(c + d)
Output-11
Сложение будет работать аналогичным образом для чисел с плавающей точкой:
e := 5.5
f := 2.5
fmt.Println(e + f)
Output8
Поскольку мы складывали два числа с типом float, Go возвращает float с дробной частью. Однако, поскольку в этом случае десятичная часть равна 0, fmt.Println
опускает десятичную часть. Чтобы надлежащим образом настроить формат вывода, мы будем использовать fmt.Printf
с %.2f
для форматирования числа с двумя знаками после запятой, как это показано в данном примере:
fmt.Printf("%.2f", e + f)
Output8.00
Синтаксис для вычитания аналогичен сложению, кроме того, что мы изменяем оператор со знака плюс (+
) на знак минус (-
):
g := 75.67
h := 32.0
fmt.Println(g - h)
Output43.67
В Go мы можем использовать операторы только для одинаковых типов данных. Мы не можем складывать int
и float64
:
i := 7
j := 7.0
fmt.Println(i + j)
Outputi + j (mismatched types int and float64)
При попытке использовать операторы с типами данных, не являющимися одинаковыми, вы получите ошибку компиляции.
Унарные математические выражения включают только один компонент или элемент. В Go мы можем использовать знаки плюс и минус как один элемент со значением, в частности, для возврата тождественности значения (+
) или изменения знака значения (-
).
Хотя обычно это не используется, значок плюс указывает тождественность значения. Мы можем использовать знак плюс с положительными значениями:
i := 3.3
fmt.Println(+i)
Output3.3
Когда мы используем знак плюс с отрицательным значением, он будет возвращать тождественность этого значения, а в данном случае это будет отрицательное значение:
j := -19
fmt.Println(+j)
Output-19
При отрицательном значении знак плюс возвращает то же самое отрицательное значение.
Знак минус, однако, изменяет знак значения. Поэтому при передаче положительного значения мы обнаружим, что знак минус, который идет перед значением, будет возвращать отрицательное значение:
k := 3.3
fmt.Println(-k)
Output-3.3
Также, когда мы используем унарный минус с отрицательным значением, будет возвращаться положительное значение:
j := -19
fmt.Println(-j)
Output19
Унарные арифметические операции со знаком плюс и знаком минус возвращают либо тождественность значения в случае +i
или значение с противоположным знаком в случае -i
.
Как и сложение и вычитание, умножение и деление будут выглядеть примерно так, как в математике. Знак, который мы используем в Go для умножения — это *
, а знак, который мы используем для деления — это /
.
Здесь приведен пример выполнения умножения в Go двух чисел с плавающей запятой:
k := 100.2
l := 10.2
fmt.Println(k * l)
Output1022.04
В Go деление имеет разные характеристики в зависимости от типа числового значения, на которое мы делим.
Если мы делим целые числа, оператор /
Go выполняет обычное деление, где для целой части x возвращаемое число — это самое большое число, которое меньше или равно x.
Если вы запустите следующий пример с делением 80 / 6
, вы получите 13
в качестве результата, а типом данных будет int
:
package main
import (
"fmt"
)
func main() {
m := 80
n := 6
fmt.Println(m / n)
}
Output13
Если желаемый результат вывода — float, вы должны явно преобразовывать значения, прежде чем выполнять деление.
Вы можете сделать это, обернув желаемый тип float32()
или float64()
вокруг ваших значений:
package main
import (
"fmt"
)
func main() {
s := 80
t := 6
r := float64(s) / float64(t)
fmt.Println(r)
}
Output13.333333333333334
Оператор %
— это модуль, который возвращает остаток, а не целую часть после деления. Это полезно для получения чисел, умножающихся на одно и то же число.
Давайте рассмотрим пример модуля:
o := 85
p := 15
fmt.Println(o % p)
Output10
Например, 85
при делении на 15
возвращает целое число 5
с остатком 10
. Наша программа возвращает значение 10
, поскольку оператор модуля возвращает остаток от деления.
Для выполнения вычисления модуля с типом данных float64
вы будете использовать функцию Mod
из пакета math
:
package main
import (
"fmt"
"math"
)
func main() {
q := 36.0
r := 8.0
s := math.Mod(q, r)
fmt.Println(s)
}
Output4
В Go, как и в математике, мы должны помнить, что операторы будут оцениваться по порядку приоритета, а не в порядке слева направо или справа налево.
Если мы рассмотрим следующее математическое выражение:
u = 10 + 10 * 5
Мы можем прочитать его слева направо, но сначала будет выполняться умножение, так что если бы мы выводили u
, то получили бы следующее значение:
Output60
Это объясняется тем, что 10 * 5
дает 50
, а затем мы добавляем 10
для получения 60
в качестве результата.
Если же мы хотим добавить значение 10
к 10
, а затем умножить сумму на 5
, нужно использовать скобки в Go, как это делается в математике:
u := (10 + 10) * 5
fmt.Println(u)
Output100
Одним из способов, с помощью которого можно запомнить порядок операций, является акроним PEMDAS:
Порядок | Символ | Значение |
---|---|---|
1 | P | Parentheses (скобки) |
2 | E | Exponent (степень) |
3 | M | Multiplication (умножение) |
4 | D | Division (деление) |
5 | A | Addition (сложение) |
6 | S | Subtraction (вычитание) |
Вы можете быть знакомы с другим акронимом для порядка операций, например, BEDMAS или BODMAS. Какой бы акроним вам ни подошел, попробуйте держать его в уме, когда вы будете выполнять математические операции в Go, чтобы получить результаты, которые вы ожидаете.
Самый распространенный оператор присвоения — это тот, который вы уже использовали: знак равенства =
. Оператор присвоения =
присваивает значение справа переменной слева. Например, v = 23
присваивает значение 23
переменной v
.
При программировании обычно используются составные операторы присвоения, выполняющие операцию со значением переменной, а затем присваивают новое полученное значение этой переменной. Эти составные операторы объединяют арифметические операторы с опертором =
. Поэтому для сложения мы соединим +
и =
для получения составного оператора +=
. Давайте посмотрим, как это выглядит:
w := 5
w += 1
fmt.Println(w)
Output6
Во-первых, мы зададим переменную w
равной 5
, а затем используем составной оператор +=
для добавления нужного числа переменной слева, а затем присвоим результат переменной w
.
Составные операторы присвоения используются в циклах for
, которые вы используете, когда хотите повторить процесс несколько раз:
package main
import "fmt"
func main() {
values := []int{0, 1, 2, 3, 4, 5, 6}
for _, x := range values {
w := x
w *= 2
fmt.Println(w)
}
}
Output0
2
4
6
8
10
12
Используя цикл for
для прохождения по срезу values
, вы можете автоматизировать процесс для оператора *=
, который умножает переменную w
на число 2
, а затем присваивает результат переменной w
.
Go имеет составной оператор присвоения для каждого из арифметических операторов, описанных в этом обучающем руководстве.
Чтобы добавить, а затем присвоить значение:
y += 1
Чтобы вычесть, а затем присвоить значение:
y -= 1
Чтобы умножить, а затем присвоить значение:
y *= 2
Чтобы разделить, а затем присвоить значение:
y /= 3
Чтобы вернуть остаток, а затем присвоить значение:
y %= 3
Составные операторы присвоения могут быть полезными, когда нужно инкрементировать или декрементировать значение, или при необходимости автоматизировать определенные процессы в вашей программе.
В этом обучающем руководстве мы познакомились с множеством операторов, которые вы будете использовать с целыми числами или числами с плавающей точкой. Вы можете узнать больше о разных типах данных в статьях Знакомство с типами данных в Go и Конвертация типов данных.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!