老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

Go语言错误总结(一)!老男孩GO语言学习周期

老男孩IT教育

常见问题

2021年8月2日 18:00

Go语言常见的错误有哪些?本篇文章为大家总结一下,我们一起来看看吧。

  Go语言常见的错误有哪些?本篇文章为大家总结一下,我们一起来看看吧。

  1、开大括号不能放在单独的一行

  在大多数其他使用大括号的语言中,你需要选择放置它们的位置。

  错误代码:


package main

import "fmt"

func main() 
{ 
    fmt.Println("hello world!")
}

  编译错误:


./main.go:5:6: missing function body for "main"
./main.go:6:1: syntax error: unexpected semicolon or newline before {

  正确代码:


package main

import "fmt"

func main() {
    fmt.Println("hello world!")
}

  2、未使用的变量

  在函数内如果声明的变量未使用,代码将编译失败,未使用的全局变量是没问题的。

  如果你给未使用的局部变量分配了一个新的值,代码还是会编译失败。你需要在某个地方使用这个变量,才能让编译器愉快的编译。

  错误代码:


package main

var gvar int

func main() {
    var one int
    two := 2
    var three int
    three = 3
}

  编译错误:


./main.go:6:6: one declared and not used
./main.go:7:9: two declared and not used
./main.go:8:6: three declared and not used

  正确代码:


package main

import "fmt"

func main() {
    var one int
    _ = one
    two := 2
    fmt.Println(two)
    var three int
    three = 3
    one = three
    var four int
    four = four
}

// 另一个选择是注释掉或者移除未使用的变量

  3、未使用的Imports

  如果你引入一个包,而没有使用其中的任何函数、接口、结构体或者变量的话,代码将会编译失败。

  你可以使用goimports来增加引入或者移除未使用的引用:


$ go get golang.org/x/tools/cmd/goimports

  如果你真的需要引入的包,你可以添加一个下划线标记符 _,来作为这个包的名字,从而避免编译失败。下滑线标记符用于引入,但不使用。

  错误代码:


package main

import (
    "fmt"
    "log"
    "time"
)

func main() {
}

  编译错误:


./main.go:4:2: imported and not used: "fmt"
./main.go:5:2: imported and not used: "log"
./main.go:6:2: imported and not used: "time"

  正确代码:


package main

import (
    _ "fmt"
    "log"
    "time"
)

var _ = log.Println

func main() {
    _ = time.Now
}

// 另一个选择是移除或者注释掉未使用的imports

  4、简式的变量声明仅可以在函数内部使用

  错误代码:


package main

myvar := 1 

func main() {  
}

  编译错误:


./main.go:3:1: syntax error: non-declaration statement outside function body

  正确代码:


package main

var myvar = 1

func main() {
}

  5、使用简式声明重复声明变量

  不能在一个单独的声明中重复声明一个变量,但在多变量声明中这是允许的,其中至少要有一个新的声明变量。

  重复变量需要在相同的代码块内,否则你将得到一个隐藏变量。

  错误代码:

package main

func main() {
    one := 0
    one := 1
}

  编译错误:

./main.go:5:6: no new variables on left side of :=

  正确代码:


package main

func main() {
    one := 0
    one, two := 1, 2
    one, two = two, one
}

  6、偶然的变量隐藏 Accidental Variable Shadowing

  短式变量声明的语法如此的方便(尤其对于那些使用过动态语言的开发者而言),很容易让人把它当成一个正常的分配操作。如果你在一个新的代码块中犯了这个错误,将不会出现编译错误,但你的应用将不会做你所期望的事情。

package main

import "fmt"

func main() {
    x := 1
    fmt.Println(x) //prints 1
    {
        fmt.Println(x) //prints 1
        x := 2
        fmt.Println(x) //prints 2
    }
    fmt.Println(x) //prints 1 (bad if you need 2)
}

  运行结果:

  1121

  即使对于经验丰富的Go开发者而言,这也是一个非常常见的陷阱。这个坑很容易挖,但又很难发现。

  你可以使用 vet命令来发现一些这样的问题。 默认情况下, vet不会执行这样的检查,你需要设置-shadow参数:

  命令:go tool vet -shadow your_file.go

go tool vet -shadow main.go
main.go:10: declaration of "x" shadows declaration at main.go:6

  7、不使用显式类型,无法使用“nil”来初始化变量

  nil标志符用于表示interface、函数、maps、slices和channels的“零值”。如果你不指定变量的类型,编译器将无法编译你的代码,因为它猜不出具体的类型。

  错误代码:


package main

func main() {
    var x = nil
    _ = x
}

  编译错误:


./main.go:4:6: use of untyped nil

  正确代码:

package main

func main() {
    var x interface{} = nil
    _ = x
}

  老男孩GO语言学习周期是多久?老男孩教育GO语言课程分为周末班、网络班,每周末一天课,学习周期为4到5个月。

  推荐阅读:

  Golang什么IDE好?老男孩GO语言学习班

  Go语言压缩文件读写之tar包

  为什么要学习GO语言?老男孩GO培训

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。