3.1 整型
- int8、int16、int32、int64
- uint8、uint16、uint32、uint64
- 两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint
- Unicode字符rune类型是和int32等价的类型
- byte和uint8类型是等价类型
- 无符号的整数类型uintptr
- 没有指定具体的bit大小但是足以容纳指针
- uintptr类型只有在底层编程时才需要
- 运算
- %取模运算符的符号和被取模数的符号总是一致的,因此-5%3和-5%-3结果都是-2。
- 除法运算符/的行为则依赖于操作数是否全为整数,比如5.0/4.0的结果是1.25,但是5/4的结果是1
- 对于整数,+x是0+x的简写,-x则是0-x的简写;
- 内置的len函数返回一个有符号的int
- 打印方法
- 用%d、%o或%x参数控制输出的进制格式
fmt.Printf("%d %[1]x %#[1]x %#[1]X\n", x)
%之后的[1]副词告诉Printf函数再次使用第一个操作数
3.2 浮点数
- float32和float64
- 浮点数的范围极限值可以在math包找到
- math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;
- math.MaxFloat64常量大约是1.8e308。它们分别能表示的最小值近似为1.4e-45和4.9e-324
- 打印方法
- 用Printf函数的%g参数打印浮点数,将采用更紧凑的表示形式打印,并提供足够的精度,但是对应表格的数据
- 使用%e(带指数)或%f的形式打印可能更合适。
- 所有的这三个打印形式都可以指定打印的宽度和控制打印精度。
fmt.Printf("x = %d e^x = %8.3f\n", x, math.Exp(float64(x)))
3.3 复数
- complex64和complex128
3.4 布尔型
3.5 字符串
- 一个字符串是一个不可改变的字节序列
s[0] = 'L' // compile error: cannot assign to s[0]
- 第i个字节并不一定是字符串的第i个字符,因为对于非ASCII字符的UTF8编码会要两个或多个字节
- 一个原生的字符串面值形式是
...
,使用反引号代替双引号。 - 在原生的字符串面值中,没有转义操作,全部的内容都是字面的意思,包含退格和换行
- 在原生字符串面值内部是无法直接写
字符的,可以用八进制或十六进制转义或+"
“连接字符串常量完成
字符串和Byte切片
标准库中有四个包对字符串处理尤为重要:
- bytes
- bytes包也提供了很多类似功能的函数,但是针对和字符串有着相同结构的[]byte类型。因为字符串是只读的,因此逐步构建字符串会导致很多分配和复制。在这种情况下,使用bytes.Buffer类型将会更有效,稍后我们将展示。
- strings
- strings包提供了许多如字符串的查询、替换、比较、截断、拆分和合并等功能。
- strconv
- strconv包提供了布尔型、整型数、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换。
- unicode
- unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等类似功能,它们用于给字符分类。每个函数有一个单一的rune类型的参数,然后返回一个布尔值。而像ToUpper和ToLower之类的转换函数将用于rune字符的大小写转换。所有的这些函数都是遵循Unicode标准定义的字母、数字等分类规范。
常量
- 所有常量的运算都可以在编译期完成
- 常量间的所有算术运算、逻辑运算和比较运算的结果也是常量
- 对常量的类型转换操作或以下函数调用都是返回常量结果:len、cap、real、imag、complex和unsafe.Sizeof
iota 常量生成器
常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一(类似于C中的枚举)
|
|
无类型常量
-
这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。
-
通过延迟明确常量的具体类型,无类型的常量不仅可以提供更高的运算精度,而且可以直接用于更多的表达式而不需要显式的类型转换。
-
只有常量可以是无类型的