正所谓“千里之行始于足下”,说的是脚踏实地,打好基础,而学习每一门编程语言,都需要学习语言提供的数据类型。数据类型用于函数和变量的声明,主要划分为:基本类型,枚举类型,字符串类型,派生类型(指针,数组,函数,切片,接口,map类型等)。其中基本类型和枚举类型有统称为算术类型。那么Go语言的数据类型也是如此分类。同时从一门语言的类型划分层面,也可以加深你对这门语言的基本划分以及发过来加深对语言总体设计的认识。
1 Go语言的算术类型
Go语言的算术类型包括,基本类型如int,float的整型和浮点型的数字,也支持复数,还有位运算。枚举类型是bool,值可以常量true也可以是false。其中int类型又分为:
- 无符号整数(后面数字代表位数):uint8,uint16,uint32,uint64
- 有符号整数(后面数字代表位数):int8,int16,int32,int64
float类型又分为:float32,float64(后面数字代表位数)。复数又complex64,complex128(后面数字代表位数)。
2 Go语言的字符串类型
Go语言的字符串类型就是一串包含一定长度的字符组成,每个字符是一个字节。同时字符串编码格式有UTF-8编码。字符串的定义和使用例子如下:
// 字符串定义
str := "HelloWorld"
// 字符串长度
fmt.Println(len(str))
// 遍历字符串中的字符
for i := 0; i < len(str); {
fmt.Println(str[i])
}
字符串的操作常用的方法都定义在strings模块包中,包括获取制定字符串的个数Count方法,判断是否包含某子字符串的Contains方法,判断包含任意字符的方法ContainsAny方法,忽略大小写情况的字符串是否相等判断EqualFold方法,按空格分隔字符串Fields方法,按指定字符串分隔的Split方法,判断是否一字符串开头的HasPrefix方法,判断是否以某字符串结尾的HasSuffix方法,以及自定义分隔符方法方式进行字符分隔的FieldsFunc方法, 如下例子。
package main
import (
"fmt"
"strings"
)
func main() {
str := "1,2,3 4,5;6"
s1 := strings.FieldsFunc(str, func(c rune) bool {
if c == ',' || c == ' ' || c == ';' {
return true
}
return false
})
print_array(s1) // 输出:123456
}
func print_array(s []string) {
for _,v := range s {
fmt.Print(v)
}
fmt.Println()
}
3 Go语言的派生类型
Go语言的派生类型主要包括:指向某一类型(内存)的指针类型即地址,用来存储一种类型的数据的数组类型,自定义结构类型的结构化类型,针对并发而设计的管道的Channel类型,所有语言都不可或缺的函数类型,以窗口的概念切入的数据窗口类型切片类型,还有针对继承抽象概念而设计的接口类型,以及数据集合的<key,value>的Map类型。代码如下
// 指针类型,如:无符号整数指针
var ptrName uintptr
//数组类型
var myArrays [100] int
//结构化类型
type structType struct{
// 属性定义
name string
id int
}
// Channel类型(管道)
ch := make(chan int)
//函数类型
func funcType (){
//函数体
}
// 切片类型
var sliceName [] int
// 接口类型
type interfaceName interface {
// 接口方法定义
}
// Map类型
var mapName map[int]string
4 总结和经验分享
Go语言中的常见和使用数据结构有Map和slice,和管道Channel类型。
其中Map类型,<key,value>类型又是业务实现中经常选择的数据结构类型,Map类型可以做基于字典的数据结构设计和查询实现。Map支持的操作有append方法来添加元素,delete方法来删除元素。以及基于下标的元素访问,还可以基于range的for循环访问,如下:
// map的访问
var mapName map[int]string
for k, v := range mapName {
fmt.Println(k, v)
}
而slice数据结构多用户字节数组操作,比如类似网络通信的业务,从底层io读取数据的时候,就会使用slice结构进行读取则会效率非常的高。2而管道Channel类型则和计算机底层的进程间通信的消息pipe类似,可以用户不同的Go语言在进行并发编程的routine之间进行通信,这个将于对routine进行讲解的时候进行详细说明。你可以先理解为一种通信手段。而且基于这个通信手段可以实现很多设计模式,如异步调用,消息通知,生产者和消费者等等。而且channel还是跨线程协作的有用工具。
关于本专栏——Go 语言教程,专栏致力于为希望可以系统地,一条一条地,一步一步的学习Go语言的朋友提供一个可以持续阅读的地方,当然也希望可以通过我的实践经验以及相应的基础,可以给你一些学习之外的想法和总结,以及提高。如果真的有帮助,哪怕一点点,可以把这个一点点的提高分享给我,欢迎跟我勾搭联系。