4.2 数据类型
包括基本数据类型和派生数据类型,如下图所示。
注意:1)不存在double类型,浮点类型只有float32和float64,也不存在float。2)没有专门的字符型,使用byte来保存单个字母(不包括中文)字符。3)int,uint类型在不同位的系统中所占的字节不相同
基本数据类型默认值
数据类型 | 默认值 |
---|---|
整型(int) | 0 |
浮点型(float) | 0 |
字符串(string) | “” |
布尔(bool) | false |
tips:printf(%v)表示按照变量的值进行输出。
4.2.1 整数类型
类型 | 有无符号 | 占用存储空间 | 范围 |
---|---|---|---|
int8 | 有 | 1字节 | -128-127 |
int16 | 有 | 2字节 | -215 ~215-1 |
~int32 | 有 | 4字节 | -231 ~231-1 |
int64 | 有 | 8字节 | -263 ~263-1 |
uint8 | 无 | 1字节 | 0~255 |
uint16 | 无 | 2字节 | 0~216-1 |
uint32 | 无 | 4字节 | 0~232-1 |
uint64 | 无 | 8字节 | 0~264-1 |
int | 有 | 32位系统4个字节 64位系统8个字节 | |
uint | 无 | 32位系统4个字节 64位系统8个字节 | |
rune | 有 | 与int32一样 | |
byte | 无 | 与uint8等价 |
整形的使用细节
//使用类型推导的情况下怎判断数据类型
//fmt.Printf()可以用于格式化输出
var num1 = 100
fmt.Printf("num1的数据类型是%T", num1)
//Go遵循保小不不保大原则:在保证程序正确运行下,尽量使用占用小的数据类型
var age byte = 10;//年龄大小0-255足够
4.2.2 小数类型/浮点型
类型 | 占用字节 | 范围 |
---|---|---|
单精度float32 | 4字节 | |
双精度float64 | 8字节 |
注意:浮点数都是有符号数,采用科学计数法,尾数部分可能丢失,造成精度丢失【要更准确应该选择精度更高的64位】。类型推导的情况下默认声明为float64,通常情况下也是用float64。
/*浮点数*/
//浮点数为有符号数:符号位+指数位+尾数位
//可能出现精度丢失,float64的精度要比float32的要准确。
var fnum1 float32 = -123.0000901
var fnum2 float64 = -123.0000901
fmt.Println("fnum1=", fnum1, "fnum2=", fnum2)
//十进制形式
fnum3 := 0.512
fnum4 := .512
fnum5 := 5.1234e2 //表示5.1234*10的2次方
fnum6 := 5.1234e2
fnum7 := 5.1234e-2 //10的-2次方
4.2.3 字符类型
Go中没有专门的字符类型,应该用byte保存单个字符。Go的字符串是由单字节连接起来,传统的字符串是由字符组成的。
注意:如果保存的字符在ASCII表上,比如[0-9,a-z,A-Z]可以直接保存到byte;如果码值大于255,此时可以考虑使用int型保存;如果需要安装字符的方式输出【汉字】,采用格式化输出。
使用细节:1)字符常量由单引号’‘括起来。2)允许使用转义字符’\'。3)Go使用utf-8编码,因此不会出现编码乱码的情况。4)字符本质是整数,直接输出对应码值。5)可以直接对变量赋数字,可视化%c输出对应的uincode字符。6)字符类型可以进行运算。
本质:存储:字符–>对应码值–>二进制–>存储;读取:二进制–>码值–>字符–>读取
/*字符类型*/
var c1 byte = 'a'
var c2 byte = '0'
fmt.Println("c1=", c1, "c2=", c2) //此时输出对应的码值
fmt.Printf("c1=%c c2=%c", c1, c2) //用printf格式化输出
//汉字
//var c3 byte = '北'//overflow溢出
var c3 int = '北' //用int类型保存
fmt.Printf("c3=%c c3对应的码值为%d", c3, c3)
//通过码值格式化输出汉字(对应关系)
var c4 int = 22269 //22269->国
fmt.Printf("c4=%c", c4) //输出“国”字
//字符类型可以进行运算,按照码值进行运算
c5 := 10 + 'a'
fmt.Println("c5=", c5) //10 + 97 = 107
4.2.4 布尔类型(bool)
只允许true和false,不允许空,重新赋值也只能true or false。占用一个字节,一般用于逻辑控制。
/*bool类型*/
var b1 = false
fmt.Println("b1", b1)
fmt.Printf("b1占用的空间=", unsafe.Sizeof(b1))
//b1 = 1 再将b1赋值会报错
4.2.5字符串类型(string)
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。
注意:1)不会出现中文乱码。2)字符串一旦赋值,字符串不能够再改变,Go中字符串不可变。3)双引号表示:识别转义字符;反引号【键盘左边】:原生形式输出,包括换行和特殊字符。4)字符串拼接。5)字符串换行。
/*字符串类型*/
var s1 string = "北京 天安门"
fmt.Println(s1)
//go中字符串不可变
var str1 string = "abc"
//str1[0] = 'b' //报错,不能再去修改str的内容
//表示方法,一般常用"";复杂情况整体输出使用反引号``
var str2 string = `
/*字符串类型*/
var s1 string = "北京 天安门"
fmt.Println(s1)`
fmt.Println(str1, "\n", str2)
//字符串拼接
str3 := "hello" + "world!"
str3 += "xzc"
//多行字符串
str4 := "xxxxxzzzzz" +
"zzcccccc"
fmt.Println(str3, str4)
4.2.6 基本数据类型转换
Golang 和java/ c不同,Go在不同类型的变量之间赋值时需要显式转换。也就是说Golang中数据类型不能自动转换【高低精度转换】。
语法:数据类型(需要转换的变量)
注意:1)Go中数据类型可以从小范围到大范围,也可以从大范围到小范围。2)被转换的是变量存储的数据【值】,变量本身的数据类型并没有发生改变。3)int64->int8编译运行不会报错,转换的结果按照溢出处理。
/*基本数据类型转换*/
var int1 int32 = 100
var f1 float32 = float32(int1) //i转换成float32
var int2 int8 = int8(int1)
var int3 int64 = int64(int1) //低精度->高精度
fmt.Printf("xi=%v,f1 = %v,x2 = %v,x3 = %v", int1, f1, int2, int3)
//int64->int8,不会报错,但是会按照溢出处理
var int4 int64 = 999999
var int5 int8 = int8(int4)
fmt.Println(int4, int5) //此时int5输出为63
4.2.7 基本数据类型与string转换
- 基本类型转string
方式一:fmt.Sprinf()
/*基本数据类型转换string*/
sint := 99
sfloat := 23.456
sbool := false
var schar byte = 'x'
var str string
//一.使用fmt.Sprintf
str = fmt.Sprintf("%d", sint) //将sint转换成string
fmt.Printf("str type:%T,str=%q\n", str, str)
str = fmt.Sprintf("%f", sfloat)
fmt.Printf("str type:%T,str=%q\n", str, str)
str = fmt.Sprintf("%t", sbool)
fmt.Printf("str type:%T,str=%q\n", str, str)
str = fmt.Sprintf("%c", schar)
fmt.Printf("str type:%T,str=%q\n", str, str)
//输出为
//str type string str="99"
//str type string str="23.456"
//str type string str="false"
//str type string str="x"
方式二:使用strconv包函数
//二.使用strconv函数
//说明:前面只能是64位int,
str = strconv.FormatInt(int64(sint), 10)
fmt.Printf("str type:%T,str=%q\n", str, str)
//说明:f表示输出格式 10:表示小数位保留10位 64:表示这个小数是float64
str = strconv.FormatFloat(sfloat, 'f', 10, 64)
fmt.Printf("str type:%T,str=%q\n", str, str)
str = strconv.FormatBool(sbool)
-
string转基本类型
使用strconv.Parse,主要返回值有两个以及传入参数的形式。
注意:需要确保string类型能够转换成有效的数据,非法情况将会返回默认值。
/*string转基本类型*/ var strbool string = "true" var bools bool //说明:strconv.ParseBool会返回两个值(value bool,err error) //只想获取第一个返回值:bools,_ bools, _ = strconv.ParseBool(strbool) fmt.Printf("bools type %T,bools= %v", bools, bools) var strint string = "654789" var ints int64 //说明:传入字符串以及整数类型10表示十进制0:int;8:int8.. ints, _ = strconv.ParseInt(strint, 10, 64) fmt.Printf("ints type:%T,ints= %v", ints, ints) var strfloat string = "123.456" var floats float64 floats, _ = strconv.ParseFloat(strfloat, 64) fmt.Printf("floats type:%T,floats= %v", floats, floats) //注意 str7 := "hello" var ints7 int64 ints7, _ = strconv.ParseInt(str7, 10, 64) fmt.Printf("ints7 type:%T,ints7= %v", ints7, ints7) //未转成功,输出默认值