一、Go 语言中的基本数据类型
Go 语言中的基本数据类型包含了三种,分别是 布尔类型
、数值类型
以及 字符串
类型三种,其中数值类型又分为 整数类型
、浮点数类型
、复数类型
。
二、Go 语言中的布尔类型
Go 中的布尔类型使用符号 bool
来表示,布尔值只有 true 和 false 两个值,占用 1 个字节。布尔类型常用流程控制语句以及函数返回值。
func main() {
isOk := true
isClosed := false
fmt.Println("bool 类型数据所占的字节大小为:", unsafe.Sizeof(isOk))
fmt.Println("bool 类型数据所占的字节大小为:", unsafe.Sizeof(isClosed))
// 获取变量类型
fmt.Printf("isOk 变量的类型是:%T\n", isOk)
fmt.Printf("isClosed 变量的类型是:%T\n", isClosed)
}
执行上述代码,输出结果如下:
bool 类型数据 true 所占的字节大小为: 1
bool 类型数据 false 所占的字节大小为: 1
isOk 变量的类型是:bool
isClosed 变量的类型是:bool
这里用到了 unsafe 包下的 Sizeof 函数,用于获取数据所占的字节大小。可以看出 true 和 false 都是占用了 1 个字节。
获取变量类型要使用格式化输出函数 fmt.Printf
,使用 %T
来表示输出变量的类型,其他常用的占位符还有 %v
格式化输出变量的值,fmt.Printf
函数不会自动换行。
Go 中的布尔类型是不能够与数字、字符串通过 bool、int、string 这种形式进行转换,但是可以通过 strconv 标准库的 ParseBool 函数 和 FormatBool 函数实现和字符串的互相转换。
三、Go 语言中的数值类型
整数类型
整数类型占用字节大小以及有无符号来划分可以分为以下几种:
- int8 有符号 8 位整型 (-128 到 127)
- int16 有符号 16 位整型 (-32768 到 32767)
- int32 有符号 32 位整型 (-2147483648 到 2147483647)
- int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
- uint8 无符号 8 位整型 (0 到 255) 8位都用于表示数值:
- uint16 无符号 16 位整型 (0 到 65535)
- uint32 无符号 32 位整型 (0 到 4294967295)
- uint64 无符号 64 位整型 (0 到 18446744073709551615)
不同的整型所占字节大小
func main() {
var a int8 = -10
var b int16 = -20
var c int32 = -30
var d int64 = -80
var e uint8 = 10
var f uint16 = 20
var g uint32 = 30
var h uint64 = 80
fmt.Println("int8 和 uint8 所占字节为:", unsafe.Sizeof(a), unsafe.Sizeof(e))
fmt.Println("int16 和 uint16 所占字节为:", unsafe.Sizeof(b), unsafe.Sizeof(f))
fmt.Println("int32 和 uint32 所占字节为:", unsafe.Sizeof(c), unsafe.Sizeof(g))
fmt.Println("int64 和 uint64 所占字节为:", unsafe.Sizeof(d), unsafe.Sizeof(h))
}
执行上述代码,输出结果如下:
int8 和 uint8 所占字节为: 1 1
int16 和 uint16 所占字节为: 2 2
int32 和 uint32 所占字节为: 4 4
int64 和 uint64 所占字节为: 8 8
int 与 unit 类型
除了上面提到的占用不同字节大小的整数值类型外,int
和 uint
也可以表示整数,它是一种动态类型,所占字节大小取决于操作系统的位数:
- 如果是32位操作系统,int类型的大小就是4字节
- 如果是64位操作系统,int类型的大小就是8个字节
func main() {
var z int = 10
fmt.Printf("变量 z 的类型为:%T, 所占字节大小为:%v", z, unsafe.Sizeof(z))
}
浮点数类型
Go 中浮点数按照字节大小划分可以分为 float32
和 float64
func main() {
var y float32 = 1.0
var z float64 = 2.0
fmt.Println("float32 所占的字节大小为:", unsafe.Sizeof(y))
fmt.Println("float64 所占的字节大小为:", unsafe.Sizeof(z))
fmt.Println("float32 可表示的最大数为:", math.MaxFloat32)
fmt.Println("float32 可表示的最大数为:", math.MaxFloat64)
}
执行上述代码,输出结果如下:
float32 所占的字节大小为: 4
float64 所占的字节大小为: 8
float32 可表示的最大数为: 3.4028234663852886e+38
float32 可表示的最大数为: 1.7976931348623157e+308
复数类型
Go语言中复数的类型有两种,分别是 complex128(64 位实数和虚数)和 complex64(32 位实数和虚数),其中 complex128 为复数的默认类型。
复数的值由三部分组成 RE + IMi,其中 RE 是实数部分,IM 是虚数部分,RE 和 IM 均为 float 类型,而最后的 i 是虚数单位。
func main() {
var x complex64 = complex(1, 2)
var y complex64 = complex(3, 4)
fmt.Println(x * y)
fmt.Println(real(x * y))
fmt.Println(imag(x * y))
}
执行上述代码,输出结果如下:
(-5+10i)
-5
10
real(z)
来获得该复数的实部,通过imag(z)
获得该复数的虚部。
数值类型的操作
Go 中数值相关的操作大部分都在 math 包下,包含了大量数值类型的计算操作。
常用的操作如下:
函数名 | 函数说明 |
---|---|
Ceil 函数 | 向上取整 |
Floor 函数 | 向下取整 |
Trunc 函数 | 获取参数的整数部分,与 Floor 函数一样,向下取整 |
Abs 函数 | 获取参数的绝对值 |
Max 函数 | 获取两个参数中的最大值 |
Min 函数 | 获取两个参数中的最小值 |
Dim 函数 | 获取两个参数相减的值和 0 比较的最大值 |
Sqrt 函数 | 获取入参的平方根 |
Cbrt 函数 | 获取入参的立方根 |
Pow 函数 | 求幂计算,获取 x 的 y 次方的值 |
func main() {
var a = 10.0
// 取绝对值
fmt.Println(math.Abs(a))
var b = 64.0
// 取平方根
fmt.Println(math.Sqrt(b))
var c = 3.0
// 幂次方,获取 a 的 c 次方值
fmt.Println(math.Pow(a, c))
var d = 27.0
// 开立方根
fmt.Println(math.Cbrt(d))
var e = 5.9
// 向上取整
fmt.Println(math.Ceil(e))
var f = 7.0
// 向下取整
fmt.Println(math.Floor(f))
// 比较大小
fmt.Println(math.Max(e, f))
fmt.Println(math.Min(e, f))
}
执行上述代码,输出结果如下:
10
8
1000
3
6
7
7
5.9
math 包下还有一个 rand 包,用户生成随机数。
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。