Go 语言具有严格的静态类型限制,运算符操作的数字类型必须是相同类型数据。且数字操作不能超出该类型的取值范围,不然计算溢出得到的结果就是错的。
一、加减乘除、取模
package main
import "fmt"
func main() {
// 加 +
var ui1, ui2 uint8
ui1 = 1
ui2 = 2
ui := ui1 + ui2
fmt.Println(ui) // 输出:3
ui += 255
fmt.Println(ui) // 溢出后计算的值就是错的,输出:2
// 减 -
var i, j int32
i = 10
j = 5
fmt.Println(i - j) // 输出:5
// 乘 *
var f1, f2 float32
f1 = 1.2
f2 = 0.2
// 浮点型的数字计算有精度问题,float32 精度6位小数,float64 精度15位小数,
fmt.Println(f1 * f2) // 输出:0.24000001
// 除 /
n1 := 10
n2 := 3
fmt.Println(n1 / n2) // 输出:3,小数被丢弃
// 求模、取余 %
fmt.Println(n1 % n2) // 输出余数:1
}
二、位运算
位运算是直接对数字在内存中存储的二进制数进行操作,所以性能上来讲是最快的运算方式。位运算一般常见于需要性能优化或复杂的算法中。位运算只作用于整数类型上。
Go 语言中的位运算符:
运算符 | 释义 | 运算规则 |
---|---|---|
& | 按位与,两个数对应的二进制位相与 | 同时为1,则为1,否则为0 |
| | 按位或,两个数对应的二进制位相或 | 有一个为1,则为1,否则为0 |
^ | 按位异或,两个数对应的二进制位相异或 | 二进制位不同,则为1,否则为0 |
&^ | 按位清空 | x&^y 如果ybit位上的数是0则取x上对应位置的值,如果ybit位上为1则结果位上取0 |
<< | 左移 | 所有二进制位左移运算符右边指定的位数,高位丢弃,低位补0。左移n位就是乘以2的n次方 |
>> | 右移 | 所有二进制位右移运算符右边指定的位数,高位补0,低位丢弃。右移n位就是除以2的n次方 |
package main
import "fmt"
func main() {
var i1, i2, n uint8 // 1个字节
// 按位与 &
i1 = 2 // 二进制:0000 0010
i2 = 3 // 二进制:0000 0011
n = i1 & i2 // 按位与:0000 0010
fmt.Println(n) // 输出:2
// 按位或 |
i1 = 10 // 二进制:0000 1010
i2 = 20 // 二进制:0001 0100
n = i1 | i2 // 按位或:0001 1110
fmt.Println(n) // 输出:30
// 按位异或 ^
i1 = 3 // 二进制:0000 0011
i2 = 4 // 二进制:0000 0100
n = i1 ^ i2 // 按位异或:0000 0111
fmt.Println(n) // 输出:7
// 按位清空 &^
i1 = 10 // 二进制:0000 1010
i2 = 20 // 二进制:0001 0100
n = i1 &^ i2 // 按位清空:0000 1010
fmt.Println(n) // 输出:10
// 左移 <<
i1 = 5 // 二进制 0000 0101
n = i1 << 2 // 左移2位:0001 0100
fmt.Println(n) // 输出:20
// 右移 >>
i2 = 15 // 二进制:0000 1111
n = i2 >> 2 // 右移2位:0000 0011
fmt.Println(n) // 输出:3
}
三、比较大小
大小比较得到的类型时布尔型。运算符:>
大于、>=
大于等于、<
小于、<=
小于等于、==
等于。
package main
import "fmt"
func main() {
fmt.Println(2 > 1) // 输出:true
fmt.Println(1 == 2) // 输出:false
}
四、数字类型转换
整型从高位类型转低位类型会有精度丢失,浮点型转整型会丢失小数点后的值,复数型转非复数整型时符号丢失。数据类型转换格式:目标类型(转换类型)
package main
import "fmt"
func main() {
// 整型转浮点型
var i int = 1
fmt.Printf("%f\n", float32(i)) // 输出:1.000000
// 浮点型转整型
var f float32 = 3.1415926
fmt.Printf("%d\n", int(f)) // 输出:3,小数后丢失
// float32 转 float64
fmt.Printf("%v\n", float64(f)) // 输出:3.141592502593994,6位后的小数精度是错误的
// float64 转 float32
var f2 float64 = 3.141592653589793
fmt.Println("%v\n", float32(f2)) // 输出:3.1415927,6位后的小数精度是错误的
}
五、数字转字符串
使用 strconv 包中定义的函数做数字和字符串转换。
package main
import (
"fmt"
"strconv"
)
func main() {
// int 转 string
var i int = 111
var s string
s = strconv.Itoa(i) // 数字转字符串
fmt.Println(s)
// string 转 int
i2, err := strconv.ParseInt(s, 10, 64) // 把 s 转为10进制64位数
if err == nil {
fmt.Println(i2) // 输出:111
}
// float 转 string
var f float64 = 3.1415926535
s1 := strconv.FormatFloat(f, 'f', -1, 64)
fmt.Println(s1) // 输出:3.1415926535
// 第二个参数选项,含义如下:
// 'b' (-ddddp±ddd,二进制指数)
// 'e' (-d.dddde±dd,十进制指数)
// 'E' (-d.ddddE±dd,十进制指数)
// 'f' (-ddd.dddd,没有指数)
// 'g' ('e':大指数,'f':其它情况)
// 'G' ('E':大指数,'f':其它情况)
// string 转 float
str := `3.1415926535`
v1, err := strconv.ParseFloat(str, 32) // ParseFloat 函数默认返回float64类型数据,转成folat32可能会有精度丢失
if err == nil {
fmt.Printf("%v\n", v1) // 输出:3.1415927410125732
}
v2, err := strconv.ParseFloat(str, 64)
if err == nil {
fmt.Printf("%v\n", v2) // 输出:3.1415926535
}
}
有疑问加站长微信联系(非本文作者)