Go语言,像c语言一样,可以生成exe文件去执行,而且添加了许多面向对象语言的特性,比如垃圾的自动回收,接口设计,反射等。
数据类型分为基础类型和符合类型两种:
基础类型:
1、 布尔类型bool:和其他语言一样,有两个值true和false,默认值为false,通过值类型推导,也可以得到。
2、 整型:和其他语言一样,是基础数据类型byte和int的衍生类型,基础与平台相关。下图所展示的所有都是类型独立的,不会自动转换,不同类型不能直接赋值及比较。
直接比较并不能通过编译:
当然可以强制转换,完全可以通过编译,但要承受精度损失和值溢出等问题:
整数的数学运算及比较运算与其他语言基本一致,位运算中取反用^表示,与java和c的~不同,需要注意。
3、 浮点类型:也就是小数类型的数据类型,采用IEEE-754标准的表达方式。需要注意的是,自动类型推导是只能推导成float64类型,如果要使用float32,需要强转,或者直接定义。另外浮点类型数据,不能直接使用==来进行比较大小。可以自己去实现判断方法。
a) float32:java语言中我们常用的float类型。
b) float64:java语言中我们常用的double类型。
4、 复数类型:对应的是数学上复数的概念,由一个实部(real)和一个虚部(imag)表示
a) complex64:
b) complex128:
5、 字符串类型:string。原生c中并没有该类型,通常使用的是字符数组也表示,以字符指针来传递,其实,和java的实现类似,也是一个不可变类型。常用操作如下:
字符串类型支持两种类型遍历:
6、 字符类型:rune,byte。byte对于go来说和整型uint8是同一个类型,代表的是utf-8字符串的单个字节的值。另外一个rune,则是代表Unicode的单个字符。但出于简化字符考虑,go语言使用Unicode字符的场景非常少。
7、 错误类型:error。对于错误类型,go语言比较直接,定义了一个接口,只需要在最后返回值中最后一个设置为error就可以了,非强制要求。如下:
复合类型:
1、 指针类型:pointer,和c语言中的指针概念基本一致,是对于内存空间位置的标记,传递数据可以使用指针,而无需进行拷贝,但是不同的是不可以进行偏移和运算。但可以进行修改。
2、 数组:array:数组是go常用数据类型,定义和其他语言相同,概念也基本一致,元素访问可以使用下标,也可以使用range关键字,但有一个特别概念(值类型,也就是在参数传递和变量赋值之时,都会进行赋值,函数体修改值是无法通过参数进行传递的。
3、 切片slice:从结构和定义方式上来看,切片与数组基本相同,遍历方法也一样,但又增加了一些灵活的使用规则。比如预留存储空间,动态扩容,以及内容复制等。具体如下:
4、 字典:map。和java语言一样,仍为未排序键值对集合,只不过和基础类型一样,不需要进行库/组件的引入。可以直接使用。和java一样,不建议使用可变类型作为key,容易查找失败。
具体的简单操作如下:
5、 通道:chan,通道是go提供的goroutine间(可以类比java 的线程)的通信方式,是进程内的通信方式,类型相关的,因此是类型安全的、但这个读写必须成对的,只读不写和只写不读,都会造成操作阻塞。Channel本身具有可传递性,
6、 结构体:struct:类似于class,只保留了组合效果,go语言中没有构造函数的概念,当然可以自己实现一个方法用作构造函数。
7、 接口:interface,go中的接口是非侵入式的,不需要强制实现接口,只要实现了该接口要求的所有函数即可。
|
请发表评论