整型
整型数据分为两类,有符号和无符号两种类型
有符号: int, int8, int16, int32, int64
无符号: uint, uint8, uint16, uint32, uint64, byte(byte与uint8类似,一般用来存储单个字符)
fmt.Printf("%T", var_name) //输出变量类型
unsafe.Sizeof(var_name) //查看变量占用字节
浮点型
浮点型也就是小数类型,可以存放小数。比如6.6,-12.34.
golang的浮点型默认为float64类型,因为它比float32更精确
字符串
字符:Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。
字符串:一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本
(1)字符串一旦赋值了,就不能修改了:在Go中字符串是不可变的。
(2)字符串的两种标识形式
双引号,会识别转义字符
var str = "abc\nabc" //输出时会换行
反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
var str string = `abc\nabc` //输出时原样输出,不会转义
布尔型
布尔类型也叫做bool类型,bool类型数据只允许取值true或false, bool类型占1个字节
指针
在上一篇博客中有介绍
结构体
执行上面代码,系统会分配两块内存,分别储存两个数据;这个时候输出一下p,结果就是:{10 20}
数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。
数组的声明语法如下:
var 数组变量名 [元素数量]Type
输出结果: [0 0 0 0]
切片
切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。
切片的定义跟数组很类似,区别就是不需要指定长度,如下:
var a []int // var 切片名 []切片值的类型
channel
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。
引⽤类型 channel 是 CSP 模式的具体实现,用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。
定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数来创建:
make(chan Type) //等价于make(chan Type, 0)
make(chan Type, capacity) //当 capacity= 0 时,channel 是无缓冲阻塞
读写的,当capacity> 0 时,channel 有缓冲、是非阻塞的,直到写满 capacity
个元素才阻塞写入。
channel通过操作符<-来接收和发送数据,发送和接收数据语法:
channel <- value //发送value到channel
<-channel //接收并将其丢弃
x := <-channel //从channel中接收数据,并赋值给x
x, ok := <-channel //功能同上,同时检查通道是否已关闭或者是否为空