在3.1.1节中,简单介绍了Go语言中的基础类型,包括整数、字符、浮点数、复数、布尔和字符串等类型。下面将详细讲解这些基础类型。
在Go语言中,数值类型包括整数、浮点数和复数等类型。
在Go语言中,整数类型包含4个有符号的整数类型和4个无符号的整数类型。其中,4个有符号的整数类型分别为int8、int16、int32和int64;4个无符号的整数类型分别为uint8、uint16、uint32和uint64。在上述8个整数类型中,分别包含8、16、32和64这4个数字,这4个数字表示的是二进制数的位数。
通过二进制数的位数能够得到每个整数类型的取值范围。对于有符号的整数类型,其取值是−2 ( n −1) ~2 ( n −1) −1;对于无符号的整数类型,其取值是0~2 n −1。例如,int8类型的取值是−128~127,而uint8类型的取值是0~255。
此外,Go语言还提供两种整数类型,即int和uint。其中,int类型是有符号的整数类型,应用广泛;uint类型是无符号的整数类型。注意,与int类型和uint类型对应的二进制数的位数,会根据编译器和计算机硬件的不同,在32位和64位之间变化。
Go语言中包含两种浮点数类型,即float32和float64。在大多数情况下,应优先使用float64。这两种浮点数类型的取值范围可以从极小到极大。为了表示“极小”和“极大”,需要借助科学记数法,即使用e或E指定指数部分。float32类型的取值大约是1.4e-45~3.4e38;float64类型的取值是4.9e-324~1.8e308。
在计算机语言中,复数是由两个浮点数组成的。其中,一个浮点数表示实部;另一个浮点数表示虚部。Go语言提供两种复数类型,即complex64和complex128。其中,complex128类型是声明复数时的默认类型。声明复数的语法格式如下。
var name complex128 = complex(x, y)
参数说明如下。
name:变量名。
complex128:复数类型。
complex():用于为复数赋值的内置函数。
x:float64类型的实部。
y:float64类型的虚部。
Go语言提供两种字符类型,即byte类型和rune类型。其中,byte类型同义于uint8类型,表示的是ASCII码的一个字符;rune类型同义于int32类型,表示的是Unicode码的一个字符。
例如,在ASCII码表中,字符A的值是65。那么,如何使用byte类型表示呢?代码如下。
var c byte = 65
Unicode码与ASCII码一样,也是一种字符集。
布尔类型的值只有两个:一个是真(即true);另一个是假(即false)。布尔类型的默认值是false。
在Go语言中,经常用到布尔类型的值。例如,作为if语句和for语句的条件部分,作为使用关系运算符或逻辑运算符后得到的结果。
【例3.5】 判断6和66是否相等,打印判断后的结果 (实例位置:资源包 \TM\sl\3\5 )
首先使用var关键字声明一个int类型的变量,并设置其初始值为6,然后分别使用运算符“==”和“!=”判断这个变量的值和66是否相等,最后打印判断后的结果。代码如下。
运行结果如下。
false true true false
在Go语言中,字符串类型是一种值类型;字符串被看作是字节的定长数组,即字节序列;字符串按照UTF-8格式编码和解码。
字符串字面量指的是使用英文格式下的双引号(即"")初始化字符串类型的变量。在这个字符串类型变量的值中,可以使用转义符实现换行、缩进等效果。在Go语言中,常用的转义符及其说明如表3.2所示。
表3.2 常用的转义符及其说明
首先使用var关键字声明一个字符串类型的变量,然后使用英文格式下的双引号(即"")把这个变量的初始值设置为“从小开始\n学编程”,最后打印这个变量的值。代码如下。
var str = "从小开始\n学编程" fmt.Println(str)
运行结果如下。
从小开始 学编程
上述代码的打印结果能换行是因为在字符串类型变量的值中包含了换行符(即“\n”)。
使用“字符串字面量”初始化字符串类型变量时,如果不使用换行符,则打印这个变量的值的结果不能换行。
为解决这个问题,可以使用英文格式下的反引号(即``)初始化字符串类型的变量。
与反引号(即``)对应的按键在Tab键的上面、数字1键的左边和Esc键的下面。
例如,首先使用var关键字声明一个字符串类型的变量,然后使用反引号(即``)把这个变量的初始值设置为“从小开始学编程”,最后打印这个变量的值。代码如下。
运行结果如下。
从小开始 学编程
使用“+”可以拼接字符串。当使用“+”拼接字符串时,须保证“+”左右两端都是字符串类型。
例如,使用“+”把字符串“Hello, ”和“world!”拼接在一起。示例代码如下。
运行结果如下。
str = Hello, world!
使用len()函数可以获取字符串长度。len()函数的语法格式如下。
len([]rune(str))
参数说明如下。
str:字符串。
当字符串包含中文时,需要先将字符串显式转换成rune数组,再传入len()函数。
例如,分别使用len(str)和len([]rune(str))依次获取字符串“Hello Leon”和“Hello张三”的长度。示例代码如下。
运行结果如下。
ls1 = 10 lrs1 = 10 ls2 = 12 lrs2 = 8
Go语言的strings.Map()函数用于处理字符串中的每个字符。语法格式如下。
func Map(mapping func(rune) rune, s string) string
参数说明如下。
mapping:处理字符串中每个字符的函数。
s:要被遍历的字符串。
例如,让字符串“hello”中的每个字符都后移一位。代码如下。
运行结果如下。
str = hello newStr = ifmmp
Go语言把“截取字符串”又称作“字符串切片”。截取字符串的语法格式如下。
string[start : end]
参数说明如下。
string:要被截取的字符串。
start:要被截取的第一个字符的索引(包含)。
end:要被截取的最后一个字符的索引(不包含)。
当字符串包含中文时,需要先将字符串显式转换成rune数组,再截取字符串。
例如,把“张三”从字符串“张三hello”中截取出来。示例代码如下。
str := "张三 hello" str1 := str[0:2] srn := []rune(str) str2 := srn[0:2] fmt.Println("str1 =", string(str1), "\nstr2 =", string(str2))
运行结果如下。
在Go语言中,分割字符串分为按空格分割和按字符串分割两种形式。
按空格分割
按空格分割字符串的语法格式如下。
例如,按空格分割字符串“Hello World!”。示例代码如下。
str := "Hello World!" strArr := strings.Fields(str) fmt.Println("strArr =", strArr)
运行结果如下。
strArr = [Hello World!]
按字符串分割
按字符串分割字符串的语法格式如下。
例如,按字符串分割字符串“as soon as possible”。示例代码如下。
str := "as soon as possible" strArr := strings.Split(str, "as") fmt.Println("strArr =", strArr)
运行结果如下。
strArr = [ soon possible]
为了在一个字符串中查找另一个字符串或字符,Go语言提供了Index()函数。Index()函数的语法格式如下。
func Index(s, substr string) int
参数说明如下。
s:源字符串。
substr:被查找的字符串。
Index()函数返回int类型的值。如果源字符串包含被查找的字符串,则返回被查找字符串第一次出现的索引;反之,则返回−1。
例如,打印字符串“as”在字符串“as soon as possible”中第一次出现的索引。示例代码如下。
str := "as soon as possible" index := strings.Index(str, "as") fmt.Println("index =", index)
运行结果如下。
index = 0
strings.Replace()函数用于把一个字符串中的某个字符串替换成新的字符串。Replace()函数的语法格式如下。
func Replace(s, old, new string, n int) string
参数说明如下。
s:源字符串。
old:要被替换的字符串。
new:新的字符串。
n:替换字符串的次数。
当n的值为−1时,将把s中所有old都替换成new。
例如,把字符串“so soon so possible”中的所有“so ”都替换为“as ”。示例代码如下。
str := "so soon so possible" fmt.Println("strReplace =", strings.Replace(str, "so ", "as ", -1))
运行结果如下。
strReplace = as soon as possible
调用fmt包中的Sprintf()函数,即可实现格式化输出的效果,语法格式如下。
fmt.Sprintf(格式化样式, 参数列表…)
参数说明如下。
格式化样式:以“%”开头的字符串输出格式。
参数列表:包含多个参数,每个参数之间用逗号隔开。
参数列表中参数的个数必须与格式化样式中字符串输出内容的个数一致,否则运行时会报错。
在Go语言中,常用的字符串输出格式及其说明如表3.3所示。
表3.3 常用的字符串输出格式及其说明
例如,首先声明并初始化表示圆周率的变量,这个变量的初始值为3.141592653589793;然后分别使用字符串输出格式“%v”和“%f”格式化表示圆周率的变量的值;最后打印执行格式化操作后的结果。代码如下。
运行结果如下。
3.141592653589793 3.141593
Sprintf()函数只负责格式化数据,不负责输出格式化后的结果。也就是说,先用Sprintf()函数按照指定的输出格式对数据执行格式化操作;再把格式化后的、字符串类型的结果赋值给一个变量;最后使用Println()函数输出这个变量,即格式化后的结果。
那么,在Go语言中,有没有一个函数可以直接输出格式化的、字符串类型的结果呢?答案是肯定的,即Printf()函数。使用Printf()函数替换上述示例中的Sprintf()函数的代码如下。