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中的枚举)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

const (
    FlagUp Flags = 1 << iota // is up
    FlagBroadcast            // supports broadcast access capability
    FlagLoopback             // is a loopback interface
    FlagPointToPoint         // belongs to a point-to-point link
    FlagMulticast            // supports multicast access capability
)

无类型常量

  • 这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。

  • 通过延迟明确常量的具体类型,无类型的常量不仅可以提供更高的运算精度,而且可以直接用于更多的表达式而不需要显式的类型转换。

  • 只有常量可以是无类型的