当前位置: 传客网 > 转:写 GO 程序中一些常见的语法和其它错误

转:写 GO 程序中一些常见的语法和其它错误

2016-10-11 作者:痛并快乐着

很多时候我们都只知道什么样儿的情况下代码会正确的执行,但是却总是记不住怎么样代码会出错,这里列出一些在 Go 开发中最经常看到的一些错误,这让我们在Go报错之前就能知道不去犯这个错,这或许能节省你很多时间。

不必须的导入 (Unncessary Imports)

创建文件 goerror1.go ,并加入下面代码:


package main

import "fmt"
import "os"

func main() {
    fmt.Println("Hello World!")
}

输出:


# command-line-arguments
./goerror1.go:4: imported and not used: "os"

错误提示为:导入了但是没有使用的包os*,为什么?在Go中,你需要使用什么,就导入什么,而导入了什么,就一定要去使用它,否则,就不要导入它,在上面的代码中,你导入了 *os 包,但是却没有使用它,所以,它的存在没有任何价值,没有任何价值的东西就不应该存在于你的代码中。

确切的名称——大小写敏感


package main

import "fmt"

func main() {
    fmt.println("Hello World!")
}

输出:


./goerror2.go:6: cannot refer to unexported name fmt.println
./goerror2.go:6: undefined: fmt.println

你定义的时候使用的是什么名称,那么在使用的使用就必须使用一模一样的名称, P 是两人个完全不同的东西,看看上面的代码,我们没有定义过 *fmt.println*,所以,我们不能去调用它,同样的,像下面这样的写法都是错误的:


Package main
Import "fmt"
import "FMT"
Func main() {}
Fmt.Println
fmt.println

用分号分开两行代码

如果你是一个有C、C++、Java或者Perl背景的开发者,你可能会注意到了, Go并不要求你在每一行代码结束时插入一个分号,这是因为它会自动的为我们添加(请看[Effective Go]9/articles/effective-go.html)这篇文章的 分号说明部分),但是,有的时候我们却开始烂用这种特性,比如下面这段代码:


package main

import "fmt"

func main() {
    fmt.Println("Hello") fmt.Println("World!")
}

输出:


./goerror3.go:6: syntax error: unexpected name, expecting semicolon or newline or }

但是下面这样的代码看上去和上面的一模一样,但是却能正确的运行:


package main

import "fmt"

func main() {
    fmt.Println("Hello")
    fmt.Println("World!")
}

输出:


Hello
World!

为什么?因为Go不允许你将两行代码写进一行,除非你显示的使用了一个分号来区分这两人行代码,比如我们把上面的代码改成下面这种形式的也是可以正确运行的:


package main

import "fmt"

func main() {
    fmt.Println("Hello"); fmt.Println("World!")
}

看了我前面翻译的那篇 [Effective Go]9/articles/effective-go.html) 这篇文章的朋友应该也会知道了,为什么上面这段代码能将两行写作一行。

不必要的分号

创建 goerror4.go 文件,写入下面这段代码,再运行它:


package main

import "fmt";;

func main() {
    fmt.Print("Hello World!")
}

输出:


/goerror4.go:3: empty top-level declaration

在Go中,任何一个分号的出现都表示一个声明的结束,那么,在上面的代码中, import “fmt”;; 中的第一个分号是可以接受的,它表示那一个声明的结束,但是在第一个与第二个分号之间不在有任何的声明出现,所以,第二个声明是多余的。

其它一些常见的语法错误

下面这些错误也是很常见的:


package 'main' // 错误,不允许使用引号包裹包名
package "main" // 同上
package main.x // 包名只允许是一个最简单的词汇,不允许使用 "."
package main/x // 同上
import 'fmt'   // 需要双引号
import fmt     // 需要双引号
func main {}   // 需要括号
func main() [] // 需要大括号
func main() { fmt.Println('Hello World!') }
               // 错误,需要使用双引号


相关推荐

返回
顶部