Golang 新手可能会踩的 50 个坑

前言

Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到。

如果花时间学习官方 doc、wiki、讨论邮件列表、 Rob Pike 的大量文章以及 Go 的源码,会发现这篇文章中的坑是很常见的,新手跳过这些坑,能减少大量调试代码的时间。

初级篇:1-34

1. 左大括号 { 一般不能单独放一行

在其他大多数语言中,{ 的位置你自行决定。Go 比较特别,遵守分号注入规则(automatic semicolon injection):编译器会在每行代码尾部特定分隔符后加 ; 来分隔多条语句,比如会在 ) 后加分号:

// 错误示例
func main()					
{
	println("hello world")
}
 
// 等效于
func main();	// 无函数体					
{
	println("hello world")
}

./main.go: missing function body ./main.go: syntax error: unexpected semicolon or newline before {

// 正确示例
func main() {
	println("hello world")
}     

注意代码块等特殊情况:

// { 并不遵守分号注入规则,不会在其后边自动加分,此时可换行
func main() {
	{
		println("hello world")
	}
}     

2. 未使用的变量

如果在函数体代码中有未使用的变量,则无法通过编译,不过全局变量声明但不使用是可以的。

即使变量声明后为变量赋值,依旧无法通过编译,需在某处使用它:

// 错误示例
var gvar int 	// 全局变量,声明不使用也可以
 
func main() {
	var one int 	// error: one declared and not used
	two := 2	// error: two declared and not used
	var three int	// error: three declared and not used
	three = 3		
}
 
 
// 正确示例
// 可以直接注释或移除未使用的变量
func main() {
	var one int
	_ = one
	
	two := 2
	println(two)
	
	var three int
	one = three
 
	var four int
	four = four
}

3. 未使用的 import

如果你 import 一个包,但包中的变量、函数、接口和结构体一个都没有用到的话,将编译失败。

可以使用 _ 下划线符号作为别名来忽略导入的包,从而避免编译错误,这只会执行 package 的 init()

// 错误示例
import (
	"fmt"	// imported and not used: "fmt"
	"log"	// imported and not used: "log"
	"time"	// imported and not used: "time"
)
 
func main() {
}
 
 
// 正确示例
// 可以使用 goimports 工具来注释或移除未使用到的包
import (
	_ "fmt"
	"log"
	"time"
)
 
func main() {
	_ = log.Println
	_ = time.Now
}

4. 简短声明的变量只能在函数内部使用

// 错误示例
myvar := 1	// syntax error: non-declaration statement outside function body
func main() {
}
 
 
// 正确示例
var  myvar = 1
func main() {
}

5. 使用简短声明来重复声明变量

不能用简短声明方式来单独为一个变量重复声明, := 左侧至少有一个新变量,才允许多变量的重复声明:

// 错误示例
func main() {  
    one := 0
    one := 1 // error: no new variables on left side of :=
}
 
 
// 正确示例
func main() {
	one := 0
	one, two := 1, 2	// two 是新变量,允许 one 的重复声明。比如 error 处理经常用同名变量 err
	one, two = two, one	// 交换两个变量值的简写
}

具体的详见https://blog.csdn.net/stpeace/article/details/81675028

posted @ 2022-06-13 10:32  司砚章  阅读(160)  评论(0编辑  收藏  举报