Go 整数和浮点数类型
整数类型
Go 语言支持多种有符号和无符号的整数类型,包括 int、uint 以及特定位宽的整数类型 int8、int16、int32、int64、uint8、uint16、uint32、uint64。
int 和 uint 的大小取决于系统架构,在 32 位系统上为 32 位,在 64 位系统上为 64 位。
byte 是 uint8 的别名,常用于表示二进制数据。
rune 是 int32 的别名,表示一个 Unicode 码点。
我总结了各种整数类型的位宽和取值范围:
类型 | 位宽 | 范围 | 说明 |
---|---|---|---|
int8 | 8-bit | -128 到 127 | 有符号 8 位整数 |
uint8 | 8-bit | 0 到 255 | 无符号 8 位整数,亦称 byte |
int16 | 16-bit | -32768 到 32767 | 有符号 16 位整数 |
uint16 | 16-bit | 0 到 65535 | 无符号 16 位整数 |
int32 | 32-bit | -2147483648 到 2147483647 | 有符号 32 位整数,亦称 rune |
uint32 | 32-bit | 0 到 4294967295 | 无符号 32 位整数 |
int64 | 64-bit | -9223372036854775808 到 9223372036854775807 | 有符号 64 位整数 |
uint64 | 64-bit | 0 到 18446744073709551615 | 无符号 64 位整数 |
int | 平台相关 | -2147483648 到 2147483647(32 位)或 -9223372036854775808 到 9223372036854775807(64 位) | 有符号整数,位宽依赖于平台(32/64 位) |
uint | 平台相关 | 0 到 4294967295(32 位)或 0 到 18446744073709551615(64 位) | 无符号整数,位宽依赖于平台(32/64 位) |
uintptr | 平台相关 | 足以存储指针的无符号整数 | 通常用于底层编程,如系统调用或 cgo |
在编程中,我会根据需求选择合适的整数类型,既要满足数值范围,又要考虑内存占用。
浮点数类型
Go 语言提供了两种精度的浮点数类型 float32 和 float64。
float32 是 32 位浮点数,精度约为 7 位小数。
float64 是 64 位浮点数,精度约为 15 位小数。
浮点数的取值范围如下:
类型 | 位宽 | 范围 | 精度 |
---|---|---|---|
float32 | 32-bit | ±1.18×10-38 到 ±3.4×1038 | 约 7 位小数 |
float64 | 64-bit | ±2.23×10-308 到 ±1.8×10308 | 约 15 位小数 |
在进行浮点数运算时,需要注意精度问题,尤其是在比较和相等测试时,可能会出现精度损失。
复数类型
Go 语言支持两种复数类型 complex64 和 complex128,分别由 float32 和 float64 的实部和虚部组成。
可以使用内置函数 complex 创建复数,例如:
c := complex(1.0, 2.0)
使用 real 和 imag 函数获取复数的实部和虚部:
realPart := real(c)
imagPart := imag(c)
我经常在需要处理复数运算时使用这些函数,非常方便。
数值常量
在 Go 中,数值常量是高精度的,可以表示任意精度的数值,只有在被赋值给变量或用于计算时,才会被转换为特定的类型。
常量可以是无类型的,编译器会根据上下文推断其类型:
const largeNumber = 123456789012345678901234567890
var num int64 = largeNumber
运算符和数学库
Go 语言提供了基本的算术和比较运算符。
算术运算符包括 +
、-
、*
、/
、%
(取模)。
比较运算符包括 ==
、!=
、>
、<
、>=
、<=
。
通过 math 包,可以使用丰富的数学函数和常量,方便进行复杂的数学计算。例如:
- 常量:
math.Pi
(圆周率)、math.E
(自然常数) - 函数:
math.Sin
、math.Cos
、math.Log
、math.Sqrt
等
示例代码:
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Pi 的值是", math.Pi)
fmt.Println("Sin(π/2) =", math.Sin(math.Pi/2))
}
数值转换
Go 语言中的数值类型转换需要显式指定,不能自动转换。例如:
var a int = 10
var b float64 = float64(a)
需要注意类型转换,避免类型不匹配的错误。
位运算
Go 语言支持以下位运算符:
- 按位与
&
- 按位或
|
- 按位异或
^
- 位清除(AND NOT)
&^
- 左移
<<
- 右移
>>
示例:
package main
import (
"fmt"
)
func main() {
var a uint = 60 // 0011 1100
var b uint = 13 // 0000 1101
fmt.Println("a & b =", a&b) // 0000 1100
fmt.Println("a | b =", a|b) // 0011 1101
fmt.Println("a ^ b =", a^b) // 0011 0001
fmt.Println("a << 2 =", a<<2) // 1111 0000
fmt.Println("a >> 2 =", a>>2) // 0000 1111
}
位运算在性能优化、权限控制等底层编程中非常有用 😊。