基础数据类型
go语言中数据类型:
- 整型
- 浮点型
- 布尔型
- 字符串
- 数组
- 切片
- 结构体
- 函数
- map
- 通道channel
- ...
整型
整型分2大类:
-
有符号整型:
其中数字代表内存中一个该类型数据占几位,位越多,能表示的范围就越大;
- int8
- int16:对应c语言的short
- int32
- int64:对应c语言中的long型
-
无符号位整型:
无符号位的整型,因第一位不用充当符号位,即正数或负数,表示的访问为无符号数最大值砍半,然后均分在0的2侧;
- uint8:即byte型,
- uint16
- uint32
- uint64
图示:
特殊整型
- unit:没有指明位数,在32位系统就是uint32,在64位系统就是uint64
- int,在32位系统就是int32,在64系统就是int64
- uintptr,无符号整型,存放一个指针;
所以,考虑到不同平台的差异,最后明确指定位数的整型数据;
数字字面量语法
go1.13版本引入,方便以二进制、八进制、十六进制定义数字;
eg:
- v := 0b00101101 表示二进制101101,相当于十进制45
- v := 0o377表示二进制377,十进制的255
- v :=0x1p-2表示十六进制的1除以2的平方,相当于十进制0.25
- 使用_分隔数据
- v := 123_456,v值就是123456
demo函数
|
|
浮点型
go支持2种浮点型,float32和float64;
- float32范围:3.4e38,使用常量定义:math.MaxFloat32
- float64范围:1.8e308,使用常量定义:math.MaxFloat64
demo:
打印浮点数,%f是浮点数的格式占位符;
|
|
复数
complex64和complex128,复数分为实部和虚部,complex64的实部和虚部都是64位,complex32则都是32位;
|
|
布尔值
布尔型bool,只有ture和fasle2个值,
- 默认是false
- go不允许将整型,强制类型转换为,布尔型
- 布尔型无法参于数据运算,无法和其他类型进行转换
|
|
字符串
字符串是go语言中原生数据类型,go中字符串实现采用utf-8编码,所以go的字符串变量中可以填入“万国字符”——中文、英文、日文都中,其格式为外部有双引号。
|
|
字符串转义符
go中常用转义符:
- \r 回车符,跳到下一行的行首
- \n 换行符,跳到下一行的同列位置
- \t 制表符
- '单引号
- "" 双引号
- \ 反斜杠
demo:打印windows下的文件路径:
|
|
多行字符串
|
|
字符串的常用操作
- len(str)求长度
- +或fmt.Sprintf 拼接字符串
- strings.Split 分割
- strings.contains 判断是否包含
- strings.HasPrefix或strins.HasSuffix前缀或后缀判断
- strings.Index(),strings.LastIndex() 子串出现的位置,从前数,或从后数
- strings.Join(a[]string, sep string) join操作
byte和rune类型
组成字符串的每个元素:都叫做字符,如一个汉字、一个英文字母,一个日文、都是一个字符,注:不同字符所占据的字节是不同的;
通过遍历字符串,可获得其中的字符元素、字符用单引号包裹;
var a := "中"
var b := "Y"
go的字符有以下2种:
- uint8类型,或叫byte型,代表ascill码表的一个字符,
- rune类型,代表一个utf-8字符,**中文、日文、韩文、这种需要用到rune类型,rune本质是一个int32类型)
go使用rune类型处理unicode编码,更方便处理基于unicode的文件,若一个文件都是ascill字符,则可以使用byte类型做文本处理,更节省空间
demo:
|
|
修改字符串
字符串本质是一个byte数组,一个字符占据一个数组的下标,修改字符串步骤:
- 先将其转换为[]rune适合utf-8编码的字符串,或[]byte,适合纯ascill字符组成的字符串!
- 对字符串数据,中的字符元素,进行修改,利用数组下标
- 完成后再转为string
- 转换中,会重新分配内存,并复制字节数组
demo:
|
|
类型转换
go中,只有强制类型转换,没有隐式类型转换,只有2个类型数据,支持相互转换时,才可做类型转换;
语法:
T(表达式):T是要转换的类型,表达式可是:变量、复杂算子、函数返回值等
demo:
|
|
练习
-
编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用
fmt.Printf()
搭配%T
分别打印出上述变量的值和类型。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
package main import ( "fmt" ) // test1 func main() { var num int = 10 var f1 float32 = 6.66 var isOk bool = true var str string = "good good study" fmt.Printf("%d, %T \n", num, num) fmt.Printf("%.1f, %T \n", f1, f1) fmt.Println(isOk) fmt.Printf("%T \n", isOk) fmt.Println(str) fmt.Printf("%T \n", str) } D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe 10, int 6.7, float32 true bool good good study string
-
编写代码统计出字符串
"hello沙河小王子"
中汉字的数量1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
package main import ( "fmt" ) // test2 // 先转换为rune数组,然后遍历数组的字符元素, // 遍历时,字符元素再转换为string类型,并利用len函数求其长度, // 若长度大于或等于3,则是汉字,计数值加1 func main() { s1 := "hello沙河小王子溜溜溜" numOfHanzi := 0 runes1 := []rune(s1) for i := 0; i < len(runes1); i++ { if len(string(runes1[i])) >= 3 { numOfHanzi++ } } fmt.Printf("the num of hanzi is : %d", numOfHanzi) } D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe the num of hanzi is : 8