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返回都是有极大风险的。