任何一门语言都有对应的基础类型,这些基础类型和现实中的事物一一对应。Go语言也不例外,Go语言数据类型包含基础类型和复合类型两大类。
基础数据类型包括:布尔型、整型、浮点型、复数型、字节型(byte)、字符串型、Unicode(rune类型,代表一个utf-8字符)。
Go语言的字符有以下两种:
uint8 类型,或者叫byte型,代表了一个ASCII的字符
rune 类型,代表一个UTF-8字符。当需要处理中文、日文或者其他复合字符时,需要用到rune类型。rune类型实际是一个int32。
Go使用了特殊的rune类型来处理Unicode,让基于Unicode的文本处理更为方便,也可以使用byte型进行默认字符串处理,性能和扩展性都有照顾。
复合数据类型包括:指针、数组、切片、字典、通道、结构体、接口。
【整型】
在Go语言中,整型分为:
有符号整型:如int、int8、int16、int32和int64
无符号整型:uint、uint8、uint16、uint32和uint64
它们的差别在于,有符号整型表示的是数值可以为负数、零和正数,而无符号整型只能是零和正数。在整型中,如果能确定int的bit就选择比较明确的int类型,因为这样会让程序具备很好地移植性。
在Go语言中,还有一种字节类型byte,它等价于uint8类型,可以理解为uint8类型的别名,用于定义一个字节,所以字节byte类型属于整型。
【浮点数】
浮点数就是代表现实中的小数。Go语言提供了两种精度的浮点数,分别是float32 和float64。项目中最常用的是float64,因为它的精度高,浮点计算的结果相比float32误差更小。
【布尔型】
一个布尔型的值只有两种:true和false,它们代表的现实中的“是”或“否”。它们的值经常被用于一些判断中。Go语言中的布尔型使用关键字bool定义。
【字符串】
Go语言中的字符串可以表示任意数据,Go语言中,字符串通过类型string声明。可以通过操作符 + 把字符串拼接起来。也可以通过+=运算符操作。
【零值】
零值其实就是一个变量的默认值,在Go语言中,如果我们声明了一个变量,但是没有对其初始化,那么Go语言会自动初始化其值为对应类型的零值。比如数字类的零值是0,布尔型的零值是false,字符串的零值是""空字符串。
变量声明
变量代表可变的数据类型,即在程序执行过程中可能会被一次甚至多次修改。
在Go语言中,通过var关键字声明语句来定义一个变量,定义的时候需要制定这个变量的类型,然后在为它取个名字,并且设置好变量的初始值。var声明一个变量的格式如下:
var 变量名 类型 = 表达式
Go语言中定义的变量必须使用,否则无法编译通过,这也是Go语言比较好的特性, 防止定义了变量不使用,导致浪费内存的情况。
Go语言具有类型推到功能,所以可以不用刻意的指定变量的类型,而是让Go语言自己推导,比如变量i的声明如下:
var i = 10
此时变量i的类型默认是int类型。也可以一次声明多个变量,把要声明的变量放到一个括号中即可,如下所示:
var(
j int = 1
k int = 2
)
// 因为类型推导,上面的多变量声明可以简写为如下方式
var (
j = 1
k = 2
)
不止int类型,后面介绍的float64、bool、string 等基础类型都可以被自动推导,即可以省略定义类型。
变量简短声明
使用var关键字声明变量,代码很繁琐,借助类型推导,Go语言提供了变量的简短声明** :=**, 结构如下:
变量名 := 表达式
i := 10
bf := false
s1 := "hello"
实际项目实战中,如果能为声明的变量初始化,那就选择简短声明方式,这种方式是使用最多的。
指针
在Go语言中,指针对应的是变量在内存中的存储位置,也就是说指针的值就是变量的内存地址。通过&可以获取一个变量的地址,也就是指针。想要获得指针指向的变量的值,通过***** 表达式即可。
p1 := &i
fmt.Println(*p1)
赋值
最简单的赋值语句就是=。
常量
一门编程语言,有变量就有常量,Go语言也不例外。在程序中,常量的值是指在编译期就确定好的,一旦确定好之后就不能再修改,这样就可以防止在运行期被恶意篡改。
常量的定义
常量的定义和变量类似,通过关键字const,因为Go语言可以类型推导,所以在常量声明是可以忽略类型。在Go语言中,只允许布尔型、字符串、数字类型这些基础类型作为常量。
iota
iota是一个常量生成器,它可以用来初始化相似规则的常量,避免重复的初始化。iota的初始值是0,它的能力是在每一个有常量声明的行后面+1。
const (
one = iota + 1
two
three
four
)
字符串和类型转换
字符串是Go语言中常用的类型。
Go语言是强类型的语言,也就是说不同类型的变量是无法相互使用和计算的,也是为了保证Go程序的健壮性,所以不同类型的变量在进行赋值或计算前,需要先进行类型转换。
i2s := strconv.Itoa(i) // alphabet 字母
s2i, err := strconv.Atoi(i)
fmt.Println(i2s, s2i, err)
通过strconv包Itoa函数可以把一个int类型转换为string,Atoi函数可以把string转换为int。同理,对于浮点数、布尔型,Go语言提供了strconv.ParseFloat、strconv.ParseBool、strconv.FormatFloat和strconv.FormatBool进行转换。
对于数字类型之间,可以通过强制转换的方式。采用强制转换的方式转换数字类型,可能会丢失一些精度,比如浮点数转整型时,小数点部分会全部丢弃。
把变量转换为对应的类型后,就可以对相同类型的变量进行各种表达式运算和赋值了。
Strings 包
讲到基础类型,尤其是字符串,不得不提Go SDK为我们提供的一个标准包Strings。它是用于处理字符串的工具包,里面有很多常用的函数,帮助我们对字符串进行操作。比如查找字符串、去除字符串的空格、拆分字符串、判断字符串是否有某个前缀或者后缀等。掌握好它,有利于我们高效编程。