大家一起学Golang——Go基本数据类型
数据类型
命名规则
命名和一般变量命名一样,字母 数字 下划线组成,不许数字开头。
驼峰式命名方式,小驼峰首字母小写 如mySlice;大驼峰 如MySlice
数据类型
-
整型
分为有符号和无符号两种类型:- 有符号:int, int8, int16, int32, int64 可以存储任何整数
- 无符号: uint, uint8, uint16, uint32, uint64, byte只能存储自然数
- 八进制整数,以0开头,0-7数字表示
- 十六进制整数,以0x或0X开头,0-9、a-f、A-F表示
-
浮点型
浮点数由整数部分、小数点和⼩数部分组成,也可以科学计数法表示。尾数部分可能丢失,造成精度损失。 -
字符
- go没有专门存储字符的类型,单个字符一般用byte来保存,字符大于255,byte无法保存,可以使用rune类型。
- 字符只能用双引号括起
- 字符是utf-8编码,英文字母占一个字符,汉字占三个
- 某变量赋值数字,通过格式化输出%c,输出对应的unicode字符
- 字符类型可以运算,相当于整数,对应的是unicode码
-
字符串
- go中字符串一串固定长度的字符连接起来的字符序列,由单个字节连起来,使用utf-8标识的unicodew文本。
- 字符串一旦赋值不能修改。
var str = "123\nabc" //识别转义字符 str := `123\nabc` //反引号原样输出,不转义 var str = "hello" + "go" //+ 拼接字符 var str1 = "hello" + "go" //多行字符拼接,+ 须在结尾
-
布尔型
包含true false, 占一个字节。
类型转换
go是静态编程语言,对数据类型一致有一定要求,面对混运算数据类型是一定要转换的。
数据类型(变量量) //将变量量转成指定的类型
数据类型(表达式) //将表达式转成指定的类型
派生数据类型
数组
数组的特点是长度固定,不能修改,存储类型一致,赋值和函数传递是值拷贝,消耗内存性能低下。
不同类型(包括数组的类型和长度)的数组不能赋值。
//声明
var arr [5]int
var arr [3][4]int //二维数组声明
var arr [5]*int
//初始化
var arr = [5]int{1,2,3,4,5}
var arr = [5]{1:1,3:3}
var arr = [...]{1,2,3,4} //长度初始化确定
var arr = [...]{1,2,3:3,4,5}
var arrStr = [...]{"hello","go"}
切片
切片可以看成是动态的数组,长度不固定,灵活使用广泛。
type slice struct {
array unsafe.Pointer
len int //当前存储⻓长度
cap int //可⽤用⻓长度
}
//声明与初始化
var a []int //nil切片,和nil相等,一般用来表示一个不存在的切片
var b = []int{} // 空切片,不与nil相等,一般表示一个空集合,空切片len cap都为0
c := []int{1,2,3}
c1 = c[1:2] //切片截取
c2 = c[1:2:cap(3)] //len为1,cap为3
d := make([]int, 2)
e := make([]int, 2,3)
copy(e,c) //切片拷贝
c = append(c, 4,5) //c切片追加
c = append(c, e...) //追加一个切片,(其中需要解包)
map
- map底层的基于Hash实现,K-V结构,无序集合。
- dict := make(map[key_T]value_T) key_T类型可以进行==操作,不能是slice 、map、函数类型。
- 应用:检测值是否存在
//var m map[int]string //nil类型 添加修改会导致panic
m := make(map[int]string)
m[1001] = "aaavalue"
//删除元素
//delete(m, 1001)
//计算数据类型在内存中占的字节大小
fmt.Println(unsafe.Sizeof(m))
fmt.Printf("%p\n", m)
- map 默认并发不安全,支持并发读,不支持并发写,会引发竞态错误。并发写可以使用 Sync.Map
- map对象删除了全部的key,也不会缩容空间。
指针
数据存储在内存中都有地址,使用十六进制数据表示。
var 指针变量量名 //默认初始值为nil 指向内存地址编号为0的空间
func main() {
var i int = 10
//指针变量也是变量 指针变量指向了变量的内存地址
//对变量取地址& 将结果赋值给指针变量
var p *int = &i
//打印指针变量p的值 同时也是i的地址
fmt.Println(p)
var p *int
//创建一个int⼤小的内存空间 返回值为*int, 不用考虑内存释放问题,go会自动释放。new创建空间并返回对应指针,相似的 make()申请空间并返回初始化空间
p = new(int)
*p = 123
//打印值
fmt.Println(*p)
//打印地址
fmt.Println(p)
}