0%

gopl-ch3

Chapter 3

Basic Date Types

  1. basic types
  2. aggregate types
    • arrays
    • structs
  3. reference types
    • pointers
    • slices
    • maps
    • functions
    • channels
  4. interface types

Integers

  1. int类型的细分
    • int8 以及对应的无符号版本uint8
    • int16
    • int32
    • int64
      byteunit8的别名,runeint32的别名. 虽然一般认为int是32位的,但是intint32是两种类型,并且需要显式的转换
  2. 模运算只能用于整数. 而对于负数来说结果的符号始终与被模数相同-5%3-5%-3的结果都是-2
  3. 除法运算当两个操作数均为整数时结果为整数(小数截断),否则为浮点数
  4. &^运算符(AND NOT)与非
  5. 关于无符号整数。一般只用在比特运算或者某些特定场景中,而不会仅仅因为所表达的数据确实是非负的就使用,考虑如下例子
    1
    2
    3
    4
    medals := []string{"gold", "silver", "bronze"}
    for i := len(medals) - 1; i >= 0; i-- {
    fmt.Println(medals[i])
    }
    其中数组的长度确实始终是非负的,但是len()函数依然返回的是有符号整数而不是无符号整数。如果len()函数返回的是无符号整数的话,那么i也将是无符号整数,那么i >= 0将永远为真,当i=0时执行i--将使得i变为int的最大值。
    总之为了避免种种类似这种错误,避免在不必要的地方使用无符号整数

Floating-Point Numbers

  1. 关于float32float64,几乎不使用float32,由于以下原因
    • float32一般来说会随着计算不断地积累误差
    • float32能够计算的最小不出现误差的整数其实也很小
      1
      2
      var f float32 = 16777216 // 1 << 24
      fmt.Println(f == f+1) // 为真
      float32可以表示大概6位的精确十进制,而float64为15位
  2. NaN的比较始终返回false,所以不能直接与NaN比较来判断,而需要使用math.IsNaN
    1
    2
    nan := math.NaN()
    fmt.Prinln(nan == nan, nan < nan, nan > nan) // 均为false

Complex Numbers

Booleans

  1. 没有从数值变量到布尔变量的隐式转换(vice versa),所以需要手动写if来判断
    1
    2
    3
    4
    i := 0
    if b {
    i = 1
    }

Strings

  1. string类型的长度是由byte数来决定的,而不是字符数,string一般以UTF-8进行编码,非ASCII码字符可能会占用多个byte,同样的对string进行取下标操作所取得的也是byte
  2. string使用slice操作(不知道是不是叫这个,就用Python里的叫法吧),得到的是一个对应范围的byte所组成的新的字符串
  3. 可以使用Python中的省略slice起点和终点的语法
  4. 使用双引号
  5. Go中的一个字符被称为rune (好像是废话)
  6. 对int使用string强制类型转换并不是将其转化为对应文字的字符串,而是对应值的字符如
    1
    fmt.Println(string(65)) // "A" 而不是"65"
    如果需要转化的话,使用strconv
  7. 使用rune切片来获得以字符分割的数据,如r := []rune(s)
  8. 使用Buufer.bytes来构建字符串
  9. 常用转换函数
    • strconv.Itoa(123)
    • strconv.Atoi("123")
    • strconv.ParseInt("123", 10, 64) 十进制,最多64bit

Constants

  1. 声明一系列const值的时候,会发生值的顺延
    1
    2
    3
    4
    5
    6
    const (
    a = 1
    b // 顺延a的值
    c = 2
    d // 顺延c的值
    )
  2. 由上述性质产生了常量产生器(Constant Generator) iota
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type Weekday int
    const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    )
    其中Sunday为0,之后的依次顺延
    并且可以使用更加复杂的表达式,如1 << (10 * iota),每次计算的时候也是将iota递增1
  3. Go中的字面常量实际上是一种无类型常量(Untyped Contants), 其具有更高的精度(可以认为至少有256位),并且有远超基本类型所能表示的数值范围和精度.如math.Pi. 当字面常量被赋值给某个基本类型的时候实际上进行了隐式的类型转换,这就要求目标类型能够装得下数据