《Go语音圣经(中文版)》笔记(7)
#《Go 语音圣经(中文版)》
#基础数据类型
#复数
Go
语言提供了两种精度的复数类型:complex64
和complex128
,分别对应float32
和float64
两种浮点数精度。
内置的complex
函数用于构建复数,内建的real
和imag
函数分别返回复数的实部和虚部:
1 | package main |
1 | [12:26:47] onns@Onns ~/Documents/code/go/go-bible/ch3 $ go run 3.7.go |
复数也可以用==
和!=
进行相等比较,只有两个复数的实部和虚部都相等的时候它们才是相等的。[1]
math/cmplx
包提供了复数处理的许多函数,例如求复数的平方根函数和求幂函数。
#布尔型
布尔值并不会隐式转换为数字值0
或1
,必须使用一个显式的if
语句辅助转换。
#字符串
一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括byte
值0
,但是通常是用来包含人类可读的文本。
文本字符串通常被解释为采用UTF8
编码的Unicode
码点(rune
)序列。
内置的len
函数可以返回一个字符串中的字节数目,索引操作s[i]
返回第i
个字节的字节值。
字符串可以用==
和<
进行比较,比较通过逐个字节比较完成的,因此比较的结果是字符串自然编码的顺序。
不变性意味如果两个字符串共享相同的底层数据的话也是安全的,这使得复制任何长度的字符串代价是低廉的。一个字符串s
和对应的子字符串切片s[7:]
的操作也可以安全地共享相同的内存,因此字符串切片操作代价也是低廉的。
一个原生的字符串面值形式是`…`,使用反引号代替双引号。
Unicode
码点对应Go
语言中的rune
整数类型(rune
是int32
等价类型)。
UTF8
编码使用1
到4
个字节来表示每个Unicode
码点:
1 | 0xxxxxxx |
1 | package main |
1 | $ go run 3.8.go |
\uhhhh
对应16bit
的码点值,\Uhhhhhhhh
对应32bit
的码点值,其中h
是一个十六进制数字。
Go
语言的range
循环在处理字符串的时候,会自动隐式解码UTF8
字符串。
UTF8
字符解码如果遇到一个错误的UTF8
编码输入,将生成一个特别的Unicode
字符\uFFFD
。
UTF8
字符串作为交换格式是非常方便的,但是在程序内部采用rune
序列可能更方便,因为rune
大小一致,支持数组索引和方便切割。
1 | // ------------------------------------------- |
1 | $ go run 3.9.go |
% x
参数用于在每个十六进制数字前插入一个空格。
将一个整数转型为字符串意思是生成以只包含对应Unicode
码点字符的UTF8
字符串,如果对应码点的字符是无效的,则用\uFFFD
无效字符作为替换。
#字符串和数字的转换
- 用
fmt.Sprintf
返回一个格式化的字符串。 - 用
strconv.Itoa()
将数字转为字符串。
fmt.Printf
函数的%b
、%d
、%o
和%x
等参数提供功能往往比strconv
包的Format
函数方便很多,特别是在需要包含附加额外信息的时候。
1 | // ------------------------------------------- |
1 | $ go run 3.10.go |
ParseInt
函数的第三个参数是用于指定整型数的大小,例如16
表示int16
,0
则表示int
。在任何情况下,返回的结果总是int64
类型,可以通过强制类型转换将它转为更小的整数类型。
#常量
1 | const pi = 3.14159 |
所有常量的运算都可以在编译期完成。
如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式写法,对应的常量类型也一样的。
1 | // ------------------------------------------- |
1 | $ go run 3.11.go |
常量声明可以使用iota
常量生成器初始化,在一个const
声明语句中,在第一个声明的常量所在的行,iota
将会被置为0
,然后在每一个有常量声明的行加一。
1 | // ------------------------------------------- |
1 | $ go run 3.12.go |
有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。
编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算,可以认为至少有256bit
的运算精度。
通过延迟明确常量的具体类型,无类型的常量不仅可以提供更高的运算精度,而且可以直接用于更多的表达式而不需要显式的类型转换。[2]
只有常量可以是无类型的。