运算符
运算符用于在程序运行时执行数学或逻辑运算。
Go 语言内置的运算符有:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
接下来让我们来详细看看各个运算符的介绍。
算数运算符
语法 | 描述/结果 |
---|---|
+x | x |
-x | x的负值 |
x++ | 为x加上一个无类型的常量1 |
x-- | 为x减去一个无类型的常量1 |
x += y | 将x加上y |
x -= y | 将x减去y |
x *= y | 将x乘以y |
x /= y | 将x除以y,如果这些数字都是整数那么任何余数都会被丢弃,除以0会导致运行时异常 |
x + y | x与y的和 |
x - y | x减去y的结果 |
x * y | x乘以y的结果 |
x / y | x除以y的结果,如果这些数字都是整数那么任何余数都会被丢弃,除以0会导致运行时异常 |
关系运算符
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,如果相等返回 True 否则返回 False。 | (A == B) 为 False |
!= | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 | (A != B) 为 True |
> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 | (A > B) 为 False |
< | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 | (A < B) 为 True |
>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 | (A >= B) 为 False |
<= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 | (A <= B) 为 True |
逻辑运算符
下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | (A && B) 为 False |
|| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 | (A || B) 为 True |
! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !(A && B) 为 True |
数值类型
Go语言提供了大量内置的数值类型,标准库也提供了big.Int类型的整数和big.Rat类型的有理数,这些都是大小不限的(只限于机器的内存)。
整型
Go语言提供了11种整型,包括5种有符号的和5种无符号的,再加上1种用于存储指针的整型类型。
类型 | 取值范围 |
---|---|
byte | 等同于uint8 |
int | 依赖不同平台下的实现,可以是int32或者int64 |
int8 | [-128, 127] |
int16 | [-32 768, 32 767] |
int32 | [-2 147 483 648, 2 147 483 647] |
int64 | [-9 223 372 036 854 775 808, 9 223 372 036 854 775 807] |
rune | 等同于uint32 |
uint | 依赖不同平台下的实现,可以是uint32或者uint64 |
uint8 | [0, 255] |
uint16 | [0, 65 535] |
uint32 | [0, 4 294 967 295] |
uint64 | [0, 18 446 744 073 709 551 615] |
uintptr | 一个可以恰好容纳指针值的无符号整数类型(对32位平台是uint32,对64位平台是uint64) |
浮点类型
Go语言提供了两种类型的浮点类型和两种类型的复数类型:
类型 | 范围 |
---|---|
float32 | |
float64 | |
complex64 | 实数和虚数都是一个float32 |
complex128 | 实数和虚数都是一个float64 |
math
语法 | 含义/结果 |
---|---|
math.Abs(x) | |x|,即x的绝对值 |
math.Acos(x) | 以弧度为单位的x的反余弦值 |
math.Acosh(x) | 以弧度为单位的x的反双曲余弦值 |
math.Asin(x) | 以弧度为单位的x的反正弦值 |
math.Asinh(x) | 以弧度为单位的x的反双正弦值 |
math.Atan(x) | 以弧度为单位的x的反余切值 |
math.Atan2(y, x) | 坐标系x正方向与射线(x,y)构成的角度的反正切值 |
math.Atanh(x) | 以弧度为单位的x的反双曲正切值 |
math.Cbrt(x) | |
math.Ceil(x) | |
math.Copysign(x, y) | 得到一个值,其绝对值与x相同,但符号与y相同 |
math.Cos(x) | 以弧度为单位的x的余弦值 |
math.Cosh(x) | 以弧度为单位的x的双曲余弦值 |
math.Dim(x) | 等价于math.Max(x-y, 0.0) |
math.E | 自然数e;值大约是2.718 281 828 459 045 |
math.Erf(x) | erf(x),即x的高斯误差函数 |
math.Erfc(x) | erfc(x),即x的互补高斯误差函数 |
math.Exp(x) | 即 |
math.Exp2(x) | 即 |
math.Expm1(x) | |
math.Float32bits(f) | |
math.Float32frombits(u) | |
math.Float64bits(x) | |
math.Float64frombits(u) | |
math.Floor(x) | |
字符串
字符串操作符
语法 | 描述/结果 |
---|---|
s += t | 将字符串t追加到字符串s末尾 |
s + t | 将字符串s和t级联 |
s[n] | 字符串s中索引位置为n(uint8类型)处的原始字符串 |
s[n:m] | 从位置n到位置m-1处取得的字符串 |
s[n:] | 从位置n到位置len(s)-1处取得的字符串 |
s[:m] | 从索引位置0的位置到m-1处取得的字符串 |
len(s) | 字符串s中的字节数 |
len([]rune(s) | 字符串s中的字符的个数——可以使用更快的utf8.RuneCountInString()来替代 |
[]rune(s) | 将字符串s转换成一个Unicode码点 |
string(chars) | 将一个[]rune或者[]int32转换成字符串,这里假设rune和int32切片都是Unicode码点 |
[]byte(s) | 无副本地将[]byte或者[]uint8转换成一个字符串类型,不保证转换的字节是合法的UTF-8编码字节 |
string(bytes) | 无副本地将[]byte或者[]uint8转换成一个字符串类型,不保证转换的字节码是合法的UTF-8编码字节 |
string(i) | 将任意数字类型的i转换成字符串,假设i是一个Unicode码点。例如,如果i是65,那么其返还值为“A” |
strconv.Itoa(i) | int类型i的字符串表示和一个错误值。例如,如果i的值是65,那么该返回值为("65", nil). |
fmt.Sprint(x) | 任意类型x的字符串表示,例如,如果x是一个值为65的数字类型,那么其返回值为"65" |
比较字符串
Go语言字符串支持常规的比较操作(<、<=、==、!=、>和>=),这些操作符在内存中一个字节一个字节地比较字符串。