「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
基本数据类型
整型
整型分为以下两个大类:
按长度分为:int8、int16、int32、int64
对应的无符号整型:uint8、uint16、uint32、uint64
其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。
注: 这里的有符号和无符号的差别在于 第一位是否为符号位
| 类型 | 描述 |
|---|---|
| uint8 | 无符号 8位整型 (0 到 255) |
| uint16 | 无符号 16位整型 (0 到 65535) |
| uint32 | 无符号 32位整型 (0 到 4294967295) |
| uint64 | 无符号 64位整型 (0 到 18446744073709551615) |
| int8 | 有符号 8位整型 (-128 到 127) |
| int16 | 有符号 16位整型 (-32768 到 32767) |
| int32 | 有符号 32位整型 (-2147483648 到 2147483647) |
| int64 | 有符号 64位整型 (-9223372036854775808 到 9223372036854775807) |
特殊整型
| 类型 | 描述 |
|---|---|
| uint | 32位操作系统上就是uint32,64位操作系统上就是uint64 |
| int | 32位操作系统上就是int32,64位操作系统上就是int64 |
| uintptr | 无符号整型,用于存放一个指针 |
注意: 在使用int和 uint类型时,不能假定它是32位或64位的整型,而是考虑int和uint可能在不同平台上的差异。
关于初始化的问题: 在上一篇中变量的初始化 a:=100 这时a的默认类型即为 int 是随操作系统位数改变而改变的
注意事项 获取对象的长度的内建len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和 uint。
数字字面量语法(Number literals syntax)
Go1.13版本之后引入了数字字面量语法,目的是为了开发者可以用二进制,八进制,十六进制等来定义数据。例如:在汇编语言中大部分都是使用的十六进制进行编码
0b开头代表二进制,v := 0b00101101, 代表二进制的 101101(4位一组表示,可以很好地转换成十六进制),相当于十进制的 45。
0o或0开头代表八进制,v := 0o377,代表八进制的 377,相当于十进制的 255。
0x开头代表十六进制,v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。
而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 表示 v 的值等于 123456。
我们可以借助fmt函数来将一个整数以不同进制形式展示。
package main
import "fmt"
func main() {
b := 0b10010
fmt.Printf("二进制 0b%b,十进制%d \n", b, b) //二进制 0b10010,十进制18
o := 0123
fmt.Printf("八进制 0o%o,十进制%d \n", o, o)//八进制 0o123,十进制83
x := 0x123
fmt.Printf("十六进制 0x%X,十进制%d \n", x, x)//十六进制 0x123,十进制291
}
浮点型
Go语言支持两种浮点型数:float32和float64。这两种浮点型数据格式遵循IEEE 754标准: float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。 float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。
打印浮点数时,可以使用fmt包配合动词%f,代码如下:
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.Pi) //默认保留小数点后6位
fmt.Printf("%.2f\n", math.Pi)
}
复数
复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)
在一些数学计算中复数是很常见的
例如 |3+4i| = = 5
欧拉公式等等
go 语言表达欧拉公式
fmt.Println(cmplx.Exp(1i*math.Phi)+1)
因为计算机浮点数是不准确的 所以结果还存在虚部而不是 0
布尔值
Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。
注意:
- 布尔类型变量的默认值为
false。 - Go 语言中不允许将整型强制转换为布尔型.
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
字符串
字符串中有很多特殊字符 例如 回车,换行等,在go中需进行转义
| 转义符 | 含义 |
|---|---|
\r | 回车符(返回行首) |
\n | 换行符(直接跳到下一行的同列位置) |
\t | 制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
例如在window下路径就可写成fmt.Println("c:\\") 否则会报错
多行字符串
当我们需要进行多行字符串的打印,例如打印古诗 《咏鹅》
正常的方式为
e := "\t\t咏鹅\n【作者】骆宾王 【朝代】唐译文对照\n\t鹅鹅鹅,\t曲项向天歌。\n\t白毛浮绿水,\t红掌拨清波。"
fmt.Println(e)
这种方式效果太差而使用多行字符串
e :=
` 咏鹅
【作者】骆宾王
鹅鹅鹅, 曲项向天歌。
白毛浮绿水, 红掌拨清波。`
fmt.Println(e)
注意:反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
所以这种也可以用来打印上面所说的windows路径
字符串的常用操作
| 方法 | 介绍 |
|---|---|
| len(str) | 求长度 |
| +或fmt.Sprintf | 拼接字符串 |
| strings.Split | 分割 |
| strings.contains | 判断是否包含 |
| strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
| strings.Index(),strings.LastIndex() | 子串出现的位置 |
| strings.Join(a[]string, sep string) | join操作 |
byte和rune类型
组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(')包裹起来,如:
var a = '中'
var b = 'x'
Go 语言的字符有以下两种:
uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。rune类型,代表一个UTF-8字符,类似于其他语言的char类型。 当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32,所以说rune是int32的别名。 它用于区分字符值和整数值
UTF-8编码最长为四个字节,那么刚好对应一个int32。
Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。
字符串的遍历
字符串的遍历有两种方式 一种是 for i 另一种是 for range 的方式这里的区别在于 for i遍历的是 []byte 而 for range遍历的是[]rune
// 遍历字符串
func traversalString() {
s := "Hi,派大星"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c)(%T) ", s[i], s[i], s[i])
}
fmt.Println()
for _, r := range s { //rune
fmt.Printf("%v(%c)(%T) ", r, r, r)
}
fmt.Println()
}
修改字符串
要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
强制类型转换
在go 语言中不同类型的转换必须显示的进行
如果a,b定义为常量,name内部float64 就无须强制转换。const数值可以作为任意类型使用
总结
基本数据类型与其他语言并没有很大的差异,其中着重要了解的就是 byte 和 rune