青少年叛逆
青少年叛逆
IT培训
广告招商

Go语言常见语法错误有哪些?老男孩GO入门

  Go语言常见语法错误有哪些?我想这是很多人都比较好奇的问题吧,接下来我们一起来看看吧。

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

  错误代码:

  package main

  import "fmt"

  func main()

  {

  fmt.Println("hello world!")

  }

  编译错误:

  ./main.g5:6: missing function body for "main"

  ./main.g6: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.g6:6: one declared and not used

  ./main.g7:9: two declared and not used

  ./main.g8: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

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

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

  错误代码:

  package main

  import (

  "fmt"

  "log"

  "time"

  )

  func main() {

  }

  编译错误:

  ./main.g4:2: imported and not used: "fmt"

  ./main.g5:2: imported and not used: "log"

  ./main.g6: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.g3: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.g5:6: no new variables on left side of :=

  正确代码:

  package main

  func main() {

  one := 0

  one, two := 1, 2

  one, two = two, one

  }

  6、Go语言命名区分大小写

  错误代码:

  package main

  import "fmt"

  func main() {

  fmt.println("Hello world")

  }

  // 以下代码都是不正确的:

  // Package main

  // iMport "fmt"

  // import "Fmt"

  // Func main() {}

  // Fmt.Println

  // fmt.println

  编译错误:

  ./main.g6:2: cannot refer to unexported name fmt.println

  ./main.g6:2: undefined: fmt.println

  正确代码:

  package main

  import "fmt"

  func main() {

  fmt.Println("Hello world")

  }

  7、Go语言中分号分行

  错误代码:

  package main

  import "fmt"

  func main() {

  fmt.Println("Hello world") fmt.Println("Hi again")

  }

  编译错误:

  ./main.g6:29: syntax error: unexpected fmt at end of statement

  正确代码:

  package main

  import "fmt"

  func main() {

  fmt.Println("Hello world")

  //解决以上问题,可以将上述的两条语句放在两行

  fmt.Println("Hi again")

  //可以将两条语句用分号结束

  fmt.Println("Hello world");fmt.Println("Hi again")

  test()

  }

  func test() {

  //因此在Go语言中,分号能省则省,如果必须使用时,添加上也不会出错。

  fmt.Println("Hello world");fmt.Println("Hi again");

  };

  8、Go语言中无效的分号

  错误代码:

  package main

  import "fmt";;

  func main() {

  fmt.Println("Hello world")

  }

  编译错误:

  ./main.g3:14: syntax error: non-declaration statement outside function body

  正确代码:

  package main

  import "fmt";

  func main() {

  fmt.Println("Hello world")

  }

  9、Go语言中注意变量作用域

  错误代码:

  package main

  var num int

  func main() {

  str := "hello world"

  if true {

  var b bool

  }

  println(num)

  println(str)

  println(b)

  }

  编译错误:

  ./main.g12:10: undefined: b

  正确代码:

  package main

  var num int

  func main() {

  str := "hello world"

  if true {

  var b bool

  println(b)

  }

  println(num)

  println(str)

  }

  10、偶然的变量隐藏

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

  package main

  import "fmt"

  func main() {

  x := 1

  fmt.Println(x) // 1

  {

  fmt.Println(x) // 1

  x := 2

  fmt.Println(x) // 2

  }

  fmt.Println(x) // 1

  }

  运行结果:

  1

  1

  2

  1

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

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

  命令:go tool vet -shadow your_file.go

  go tool vet -shadow main.go

  main.g10: declaration of "x" shadows declaration at main.g6

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

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

  错误代码:

  package main

  func main() {

  var x = nil

  _ = x

  }

  编译错误:

  ./main.g4:6: use of untyped nil

  正确代码:

  package main

  func main() {

  var x interface{} = nil

  _ = x

  }

  12、使用“nil” Slices and Maps

  在一个nil的slice中添加元素是没问题的,但对一个map做同样的事将会生成一个运行时的panic。

  正确代码:

  package main

  func main() {

  var s []int

  s = append(s, 1)

  }

  错误代码:

  package main

  import (

  "fmt"

  )

  func main() {

  var m map[int]int

  m[1] = 1

  fmt.Println(m)

  }

  运行错误:

  panic: assignment to entry in nil

注意:吐槽知乎网只是一个问答与文章免费发布平台,所有信息均有会员免费发布,不产生金钱交易,如果你有资金往来,请及时通过电话与对方联系,调查清楚,确认无误在选择,否则造成你的损失,由自己承担,本平台概不负责,谢谢!

0 个评论

要回复文章请先登录注册

狗粮批发
嘿,进入会员专区!