Go语言学习(三)
第3章 基本数据
本章介绍基础类型
3.1 整数
- 此外还有int和uint两种累心。它的大小取决于所在硬件平台和编译器,两者大小相同。
- rune类型是int32类型的同义词,常常用于指明一个值是Unicode码点(code point)。
- byte是uint8类型的同义词,强调一个值是原始数据。
- 无符号整数类型uintptr,其大小不明确,但足以完整存放指针。uintptr型仅仅用于底层编程,例如在Go程序与C程序库或操作系统的接口界面。
- 浮点数转成整型,会舍弃小数部分,趋零结尾(正值向下取整,负值向上取整)。
- 当前。八进制数似乎仅有一种用途——表示POSIX文件系统的权限——而十六进制数广泛用于强调其位模式,而非数值大小
3.2 浮点数
类型 | 其他 |
---|---|
float32 | math.MaxFloat32=3.4e38 math.MinFloat32=1.4e-45 |
float64 | math.MaxFloat64=1.8e308 math.MinFloat64=4.9e-324 |
十进制下,flaot32的有效数字大约为6位,float64的有效数字大约是15位。绝大多数情况下,应优先选用float64,因为除非格外小心,否则float32的运算会迅速累积误差。另外,float32能精确表示的正整数范围有限。
小数点前面的0和后面的0可以省略:.707、1.
科学计数法:6.0e-34
math包中的Inf
和-Inf
表示正无穷和负无穷,NaN
表示非数字,math.IsNaN
和math.NaN
函数判断七参数是否为非数值,但是结果不能进行比较
3.3 复数
Go具备两种大小的复数complex64
和complex128
,二者分别由float32和float64构成。内置的complex函数根据给定的实部和虚部创建复数,而内置的real函数和imag函数则分别提取复数的实部和虚部
var x complex128 = complex(1,2) // 1+2i
var y complex128 = complex(3,4) // 3+4i
fmt.Println(x*y) // "(-5+10i)"
fmt.Println(real(x*y)) // "-5"
fmt.Println(imag(x*y)) // "10"
在浮点数或十进制数后面紧跟着i,就变成了一个实部为零的复数
附属常量可以与其他常量相加(整形或浮点型,实数和虚数皆可)
可以用==
和!=
判断复数是否等值。若两个复数的实部和虚部都相同,则他们相等。
math/cmplx包提供了复数运算所需的库函数,例如复数的平方根函数和复数的幂函数。
3.4 布尔值
-
bool型的值或布尔值只有两种可能:真(true)和假(false)。
-
&&
较||
优先级更高 -
布尔值无法隐式地转换成数值(如0或1)
使用显式if:i := 0 if b { i = 1 }
-
如果转换操作常常用到,我们可以专门写个函数
func btoi (b bool) int { if b { return 1 } return 0 }
-
反向操作:
func itob(i int) bool { return i != 0 }
3.5 字符串
- 字符串是不可变的字节序列,他可以包含任意数据,包括0值字节,但主要是人类可读的文本。习惯上,文本字符串被解读成按UTF-8编码的Unicode码点(文字符号)序列。
- 内置的len函数返回字符串的字节数(并非文字符号的数目),下标访问操作s[i]则取得第i个字符,其中0≤i<len(s)
- 字符串的第i个字节比一定就是第i个字符,因为非ASCII字符的UTF-8码点需要两个字节或多个字节
- 字符串切片操作和python差不多,+也通用
- 字符串不可改变,所以字符串内部的数据不允许修改,使得复制任何长度字符串的开销都低廉。
- 子串的生成只需要新建一个指针指向对应的数据地址
3.5.1 字符串字面量
- 字符串的值可以直接写成字符串字面量(string literal),形式上就是带双引号的字节序列:"Hello,world"
原生的字符串字面量
的书写形式时`…`,使用反引号而不是双引号。原生的字符串字面量内转义字符不能起作用;实质内容与字面写法严格抑制,包括反斜杠和换行符,因此,在程序源码中,原生的字符串字面量可以展开多行。唯一的特殊处理是回车符会被删除(换行符会保留),使得同一字符串在所有平台上的值都有相同,包括习惯在文本文档存入换行符的系统
3.5.3 UTF-8
- Go的源文件以UTF-8编码。
- Go语言中,字符串字面量的转义让我们得以用码点的值雷志明Unicode字符。有两种形式,\uhhhh表示16位码点值,\Uhhhhhhhh表示32位码点值,其中每个h代表一个十六进制数字;32位形式的码点值几乎不需要用到。这两种形式都已UTF-8编码表示出给定的码点,如下实例:
"世界"
"\xe4\xb8\x96\xe7\x95\x8c"
"\u4e16\u754c"
"\U00004e16\U0000754c"
后面三行的转义序列用不同的形式表示第一行的字符串,但实质上他们的字符串值都是相同的
3.5.4 字符串和字节slice
- 4个标准包对字符串操作特别重要:bytes、strings、strconv和unicode
3.5.5 字符串和数字的相互转换
- 整数转换为字符串,一种选择使用fmt.Sprintf,另一种做法是使用函数
strconv.Itoa("interger to ASCIII")
:
x := 123
y := fmt.Sprintf("%d",x)
fmt.Println(y,strconv.Itoa(x)) // “123 123” - FormatInt和FormatUint()可以按不同的进位格式化数字:
fmt.Println(strconv.FormatInt(int64(x),2)) //“1111011”
3.6 常量
- 常量是一种表达式,其可以保证在编译阶段就计算出表达式的值,并不需要等到运行时,从而使编译器得以知晓其值,所有常量本质上都属于基本类型:布尔值、字符串或数字。
3.6.1 常量生成器iota
- 常量的声明可以使用常量生成器iota,它创建一系列相关值,而不是逐个值显式写出。常量声明中,iota从0开始取值,逐项加1.