-
左大括号 { 一般不能单独放一行
Golang的分号注入规则(automatic semicolon injection):编译器会在每行代码尾部特定分隔符后加 ; 来分隔多条语句
-
未使用的变量无法通过编译
如果在函数体代码中有未使用的变量,则无法通过编译,不过全局变量声明但不使用是可以的。即使变量声明后为变量赋值,依旧无法通过编译,需在某处使用它。
-
未使用的import无法通过编译
如果你 import 一个包,但包中的变量、函数、接口和结构体一个都没有用到的话,将编译失败。可以使用 _ 下划线符号作为别名来忽略导入的包,从而避免编译错误,这只会执行 package 的 init()
-
简短声明的变量只能在函数内部使用
:=只能在局部
-
不能使用简短声明来重复声明变量
-
不能使用简短声明来设置字段的值
-
不小心覆盖了变量
func main() { x := 1 println(x) // 1 { println(x) // 1 x := 2 println(x) // 2 // 新的 x 变量的作用域只在代码块内部 } println(x) // 1 }
可使用 vet 工具来诊断这种变量覆盖,Go 默认不做覆盖检查,添加 -shadow 选项来启用。
-
显式类型的变量无法使用 nil 来初始化
nil 是 interface、function、pointer、map、slice 和 channel 类型变量的默认初始值。但声明时不指定类型,编译器也无法推断出变量的具体类型。
// 错误示例 func main() { var x = nil // error: use of untyped nil _ = x } // 正确示例 func main() { var x interface{ } = nil _ = x }
-
直接使用值为 nil 的 slice、map
允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素则会造成运行时 panic
-
在创建 map 类型的变量时可以指定容量,但不能像 slice 一样使用 cap() 来检测分配空间的大小
-
string 类型的变量值不能为 nil,字符串类型的零值是空串 “”
-
Array 类型的值作为函数参数
在 Go 中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。如果想修改参数数组,直接传递指向这个数组的指针类型。直接使用 slice:即使函数内部得到的是 slice 的值拷贝,但依旧会更新 slice 的原始数据(底层 array)。 -
range 遍历 slice 和 array 时混淆了返回值。
与其他编程语言中的 for-in 、foreach 遍历语句不同,Go 中的 range 在遍历时会生成 2 个值,第一个是元素索引,第二个是元素的值。
// 错误示例 func main() { x := []string{ "a", "b", "c"} for v := range x { fmt.Println(v) // 1 2 3 } } // 正确示例 func main() { x := []string{ "a", "b", "c"} for _, v := range x { // 使用 _ 丢弃索引 fmt.Println(v) } }
-
range 遍历 slice 和 array 时混淆了返回值。
-
访问 map 中不存在的 key。
Go 则会返回元素对应数据类型的零值,比如 nil、’’ 、false 和 0,取值操作总有值返回,故不能通过取出来的值来判断 key 是不是在 map 中。检查 key 是否存在可以用 map 直接访问,检查返回的第二个参数即可:
// 错误的 key 检测方式 func main() { x := map[string]string{ "one": "2", "two": "", "three": "3"} if v := x["two"]; v == "" { fmt.Println("key two is no entry") // 键 two 存不存在都会返回的空字符串 } } // 正确示例 func main() { x := map[string]string{ "one": "2", "two": "", "three": "3"} if _, ok := x["two"]; !ok { fmt.Println("key two is no entry") } }
-
string 类型的值是常量,不可更改。
尝试使用索引遍历字符串,来更新字符串中的个别字符,是不允许的。string 类型的值是只读的二进制 byte slice,如果真要修改字符串中的字符,将 string 转为 []byte 修改后,再转为 string 即可。
// 修改字符串的错误示例 func main() { x := "text" x[0] = "T" // error: cannot assign to x[0] fmt.Println(x) } // 修改示例 func main() { x := "text" xBytes := []byte(x) xBytes[0] = 'T' // 注意此时的 T 是 rune 类型 x = string(xBytes) fmt.Println(x) // Text }
-
string 与 byte slice 之间的转换
当进行 string 和 byte slice 相互转换时,参与转换的是拷贝的原始值。这种转换的过程,与其他编程语的强制类型转换操作不同,也和新 slice 与旧 slice 共享底层数组不同。
-
string 与索引操作符
对字符串用索引访问返回的不是字符,而是一个 byte 值。
-
字符串并不都是 UTF8 文本
string 的值不必是 UTF8 文本,可以包含任意的值。只有字符串是文字字面值时才是 UTF8 文本,字串可以通过转义来包含其他数据。
<
Golang 语言使用的注意事项
最新推荐文章于 2022-12-14 21:37:14 发布