go语言学习之数据类型
1.数据类型分为两大类:
基本数据类型
复杂/派生数据类型
2.基本数据类型分为:
数值型:
整数型:
(int ,int8,int16,int32,int64)
(unit,unit8,unit16,unit32,unit64)
浮点型:
(float32,float64)
字符型:
没有专门的字符集,使用byte表示单个字母字符
布尔型:
bool(true,false)
字符串:
string
补充:
byte是unit8的别名
rune是int32的别名,表示一个Unicode码点
complex64,complex128(表示复数)
3.复杂数据类型
1.指针(Pointer)
2.数组
3.结构体(struct)
4.管道(Channel)
5.函数
6.切片(slice)
7.接口(interface)
8.map
4.整数类型详解
有符号整数类型
package main
import "fmt"
func main() {
var i int8 =127
fmt.Println(i)
}
可以用上面方式测试整数类型大小
无符号整数类型
可以用上面方式测试无符号整数类型大小
其他的整数类型
5.整数类型使用细节
var n =1000
//fmt.Printf() 可以用做格式化输出 %T 显示变量的数据类型
fmt.Printf("n的类型为%T",n)
结果为: n的类型为 int
细节3代码示例:
//如何在程序中查看一个变量的占用字节大小和数据类型(使用较多)
var x int32 =888
//unsafe.Sizeof(x) 是unsafe包的一个函数,可以返回x变量占用的字节数
fmt.Printf("X的类型为 %T,大小为%d",x,unsafe.Sizeof(x))
//结果为:X的类型为 int32,大小为4
细节4:
//go 开发时,数据类型的使用遵守保小不保大的原则,为了节省内存空间
//比如开发时,一个人的年龄范围 1--120,我们使用byte 可以满足需求,就没必要使用int62 ,int 32
细节5:一个byte等于八个bit
6.小数类型/浮点类型
代码示例:
//定义一个变量存储价格
var price float32 =99.99
fmt.Println("猪肉的价格为",price,"1kg")
小数类型分类:单精度,双精度
1》代码示例:
var num1 float32=-0.7788521
var num2 float64= 3.1415926786
fmt.Println("num1=",num1,"num2=",num2)
2》代码示例:
//尾数部可能丢失
var num3 float32=1.0003456789
var num4 float64=1.0003456789
fmt.Println("num3=",num3)
fmt.Println("num4=",num4)
// //结果为 :num3= 1.0003457 精度损失
float64 精度高于float32
7.浮点类型的使用细节
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrkNrWu0-1574842403731)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574759724458.png)]
var num5 =1.23
fmt.Printf("num5的类型为%T",num5)
示例3;
num7:=3.14
num8:=.123
fmt.Println("num7=",num7,"num8=",num8)
//结果为 :num7= 3.14 num8= 0.123
科学计数法示例:
//科学计数法
num9:=5.21e2
num10:=5.21E3
fmt.Println("num9=",num9,"num10=",num10)
//结果为:num9= 521 num10= 5210
8.字符类型详解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnJs55qd-1574842403734)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574760523047.png)]
// 直接输出字符是ascii 码值
var s1 byte='a'
var s2 byte='1'
fmt.Println("s1=",s1) //s1=97
fmt.Println("s2=",s2)//s2=49
//如果我们希望输出对应字符,需要使用格式化输出
fmt.Printf("s1=%c s2=%c",s1,s2)
//var s3 byte ='肖'//constant 32918 overflows byte 溢出
var s3 int ='肖'
fmt.Printf("s3=%c,ascii 码值为 %d",s3,s3)//s3=肖,ascii 码值为 32918
注意:如果我们保存的字符为[0-9,A-Z,a-z]可以直接使用byte
如果保存的ascii码值大于255,可以考虑使用int,
如果我们要想输出具体的字符,请进行格式化输出 %c
9.字符使用细节
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxxQ8lWI-1574842403738)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574763160439.png)]
1.utf-8 兼容ascii 码
2.英文字母1个字节,汉字三个字节
//可以直接给某个变量赋一个值,通过格式化输出unicode字符
var s4 int=32918
fmt.Printf("s4=%c",s4)//32918s4=肖
//字符类型是可以直接参与运算的
var s5='a'+10
fmt.Println(s5)//107
http://www.mytju.com/classcode/tools/encode_utf8.asp 查看码值的链接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YTwvhDzT-1574842403741)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574764093760.png)]
10.布尔类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FG2o2sz6-1574842403745)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574764185862.png)]
var b bool
fmt.Println(b)
fmt.Printf("b的大小:%d",unsafe.Sizeof(b))
11.字符串类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0y12btc-1574842403748)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574764559329.png)]
var str string="你好,世界"
fmt.Println(str)
12.字符串类型细节
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIJLgVkf-1574842403753)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574765089066.png)]
//反引号
var strx string=` var b bool
fmt.Println(b)
fmt.Printf("b的大小:%d",unsafe.Sizeof(b))
var str string="你好,世界"
fmt.Println(str)`
fmt.Println(strx)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOgiuavq-1574842403758)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574765467220.png)]
13.go基本数据类型默认值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWZ5fvTS-1574842403762)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574765669354.png)]
14.go基本数据类型转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cx7DIVLg-1574842403764)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574765797892.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RJ0rctDc-1574842403768)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574765962084.png)]
15.基本数据类型和string 的转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QYvpfAPw-1574842403772)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574769104384.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8Kp90mM-1574842403775)(C:\Users\xiaoweifeng\AppData\Roaming\Typora\typora-user-images\1574769626043.png)]
var y1 int =100
var y2 float32=23.345
var y3 bool =true
var y4 byte='a'
var st string
st=fmt.Sprintf("%d",y1)
fmt.Printf("st type %T st =%q\n",st,st)
st=fmt.Sprintf("%f",y2)
fmt.Printf("st type %T st =%q\n",st,st)
st=fmt.Sprintf("%t",y3)
fmt.Printf("st type %T st =%q\n",st,st)
st=fmt.Sprintf("%d",y4)
fmt.Printf("st type %T st =%q\n",st,st)
第二种:
func FormatBool(b bool) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
16.string 转基本数据类型
使用strconv 包下的函数进行转换
func ParseBool(str string) (value bool, err error)
示例:
var str string ="true"
var b bool
b, _ =strconv.ParseBool(str)
//strconv.ParseBool(str) 函数会返回两个值(value bool,err error)
//所以我们用_忽略第二个值
fmt.Printf("b type %T b=%v\n",b,b)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
示例:
var str2 string ="12345"
var i int64
var i2 int
i, _ =strconv.ParseInt(str2,10,64)
i2=int(i)
fmt.Printf("i的类型 %T i=%v\n",i,i)
fmt.Printf("i2的类型 %T i2=%v\n",i2,i2)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
示例:
var str3 string ="123456"
var u uint64
var u2 int
u, _ =strconv.ParseUint(str3,10,64)
u2=int(u)
fmt.Printf("u的类型 %T u=%v\n",u,u)
fmt.Printf("u2的类型 %T u2=%v\n",u2,u2)
func ParseFloat(s string, bitSize int) (f float64, err error)
示例:
var str4 string ="3.14159"
var f float64
f,_=strconv.ParseFloat(str4,64)
fmt.Printf("f 的类型 %T f=%v\n",f,f)
注意事项:
在将string 转换成基本数据类型时,确保string 能转成有效的数据,比如我们可以将 “111”,转成整数,但是不能把"helloworld"转换成整数,Go会将其转换成 0,其他类型也一样 float==>0, bool==>false
17.指针
17.1基本介绍:
1》基本数据类型存的就是值,也叫值类型
2》获取变量的地址用&,比如 :var b bool 获取 b的地址用 &b
var bb bool
fmt.Printf("bb 的地址为 %v,bb=%v\n",&bb,bb)
//bb 的地址为 0xc000012130,bb=false
3》指针类型,存储的是一个变量的地址,这个地址指向的值才是变量的值
//ptr 是一个指针变量,数据类型为 *int,ptr=&n
var n int =111
var ptr *int=&n
fmt.Printf("ptr type %T,ptr=%v\n",ptr,ptr)
//ptr type *int,ptr=0xc000064110
4》获取ptr向的值,用 *ptr
fmt.Printf("ptr指向的值为 %v\n",*ptr)
//ptr指向的值为 111
17.2练习:
1》写一个程序,获取一个变量的地址值
2》用该地址值修改这个变量的值
var bl bool//默认值 false
var ptr2 *bool=&bl
*ptr2=true
fmt.Printf("bl的类型 %T,bl的值 %v\n",bl,bl)
//bl的类型 bool,bl的值 true
指针变量,数据类型为 *int,ptr=&n
var n int =111
var ptr *int=&n
fmt.Printf(“ptr type %T,ptr=%v\n”,ptr,ptr)
//ptr type *int,ptr=0xc000064110
4》获取ptr向的值,用 *ptr
fmt.Printf("ptr指向的值为 %v\n",*ptr)
//ptr指向的值为 111
#### 17.2练习:
1》写一个程序,获取一个变量的地址值
2》用该地址值修改这个变量的值
var bl bool//默认值 false
var ptr2 *bool=&bl
*ptr2=true
fmt.Printf("bl的类型 %T,bl的值 %v\n",bl,bl)
//bl的类型 bool,bl的值 true