Go语言学习笔记(二)--数据类型

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转换

  1. 基本类型转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)
  1. 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) //未转成功,输出默认值
    
    

猜你喜欢

转载自blog.csdn.net/Destinyxzc/article/details/127751623