Go语言常见坑点(3)| 青训营笔记

73 阅读2分钟

1.字符串并不都是 UTF8 文本

string 的值不必是 UTF8 文本,可以包含任意的值。只有字符串是文字字面值时才是 UTF8 文本,字串可以通过转义来包含其他数据。

判断字符串是否是 UTF8 文本,可使用 “unicode/utf8” 包中的 ValidString() 函数:

func main() {
    str1 := "ABC"
    fmt.Println(utf8.ValidString(str1))    // true

    str2 := "A\xfeC"
    fmt.Println(utf8.ValidString(str2))    // false

    str3 := "A\\xfeC"
    fmt.Println(utf8.ValidString(str3))    // true    // 把转义字符转义成字面值
}

2.15.switch 中的 fallthrough 语句

switch 语句中的 case 代码块会默认带上 break,但可以使用 fallthrough 来强制执行下一个 case 代码块。

func main() {
    isSpace := func(char byte) bool {
        switch char {
        case ' ':    // 空格符会直接 break,返回 false // 和其他语言不一样
        // fallthrough    // 返回 true
        case '\t':
            return true
        }
        return false
    }
    fmt.Println(isSpace('\t'))    // true
    fmt.Println(isSpace(' '))    // false
}

3.向已关闭的 channel 发送数据会造成 panic

  • 从已关闭的 channel接收数据是安全的,接收状态值 ok 是 false 时表明 channel 中已没有数据可以接收了

  • 从有缓冲的channel中接收数据,缓存的数据获取完再没有数据可取时,状态值也是 false

  • 向已关闭的channel中发送数据会造成 panic

4.在 range 迭代 slice、array、map 时通过更新引用来更新元素

在 range 迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,即是拷贝的地址并不是原有元素的地址

5.append()可以追加nil值

实际上nil是一个预定义的值,即空值,所以可以向切片中追加,从技术上讲是没有问题,但在使用场景中可能会存再一些问题,建议酌情使用

6. append()错误使用导致无返回值

append()的本质是向切片中追加数据,而随着切片中元素逐渐增加,当切片底层的数组将满时,切片会发生扩容。 但这就产生一个问题,append每个追加元素,都有可能触发切片扩容,也即有可能返回一个新的切片,这也是append函数声明中返回值为切片的原因。实际使用中应该总是接收该返回值。 但当初始切片长度为0,所以实际上每次append都会产生一个新的切片并迅速抛弃(被gc回收),因而导致错误 原始切片并没有任何改变。需要特别说明的是,不管初始切片长度为多少,不接收append返回都是有极大风险的。