大家一起学Golang——Go基本数据类型

大家一起学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)
}
发布了30 篇原创文章 · 获赞 5 · 访问量 7657

猜你喜欢

转载自blog.csdn.net/c0586/article/details/104199788