• Go语言常见语法错误


    Go语言常见语法错误

    转载自大神博客

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

    错误代码:

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

    编译错误:

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

    正确代码:

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

    2、未使用的变量

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

    错误代码:

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

    编译错误:

    ./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
    123
    

    正确代码:

    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
    }
    
    // 另外可以选择是注释掉或者移除未使用的变量
    1234567891011121314151617
    

    3、未使用的Imports

    如果你引入一个包,而没有使用其中的任何函数、接口、结构体或者变量的话,代码将会编译失败。
    如果你真的需要引入的包,你可以添加一个"_"下划线标记符,来作为这个包的名字,从而避免编译失败。下滑线标记符用于引入,但不使用。

    错误代码:

    package main
    
    import (
        "fmt"
        "log"
        "time"
    )
    
    func main() {
    }
    ```go
    
    编译错误:
    
    1234567891011121314
    

    ./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”

    正确代码:
    
    ​```go
    package main
    
    import (
        _ "fmt"
        "log"
        "time"
    )
    
    var _ = log.Println
    
    func main() {
        _ = time.Now
    }
    
    // 另外可以选择是移除或者注释掉未使用的imports
    12345678910111213141516171819
    

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

    错误代码:

    package main
    
    myvar := 1 
    
    func main() {  
    }
    123456
    

    编译错误:

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

    正确代码:

    package main
    
    var myvar = 1
    
    func main() {
    }
    123456
    

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

    你不能在一个单独的声明中重复声明一个变量,但在多变量声明中这是允许的,其中至少要有一个新的声明变量。
    重复变量需要在相同的代码块内,否则你将得到一个隐藏变量。

    错误代码:

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

    编译错误:

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

    正确代码:

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

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

    错误代码:

    package main
    
    import "fmt"
    
    func main() {
        fmt.println("Hello world")
    }
    
    // 以下代码都是不正确的:
    // Package main
    // iMport "fmt"
    // import "Fmt"
    // Func main() {}
    // Fmt.Println
    // fmt.println
    123456789101112131415
    

    编译错误:

    ./main.go:6:2: cannot refer to unexported name fmt.println
    ./main.go:6:2: undefined: fmt.println
    12
    

    正确代码:

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello world")
    }
    1234567
    

    7、Go语言中分号分行

    错误代码:

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello world") fmt.Println("Hi again")
    }
    1234567
    

    编译错误:

    ./main.go:6:29: syntax error: unexpected fmt at end of statement
    1
    

    正确代码:

    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");
    };
    12345678910111213141516171819
    

    8、Go语言中无效的分号

    错误代码:

    package main
    
    import "fmt";;
    
    func main() {
        fmt.Println("Hello world")
    }
    1234567
    

    编译错误:

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

    正确代码:

    package main
    
    import "fmt";
    
    func main() {
        fmt.Println("Hello world")
    }
    1234567
    

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

    错误代码:

    package main
    
    var num int
    
    func main() {
        str := "hello world"
        if true {
            var b bool
        }
        println(num)
        println(str)
        println(b)
    }
    12345678910111213
    

    编译错误:

    ./main.go:12:10: undefined: b
    1
    

    正确代码:

    package main
    
    var num int
    
    func main() {
        str := "hello world"
        if true {
            var b bool
            println(b)
        }
        println(num)
        println(str)
    }
    12345678910111213
    

    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 
    }
    1234567891011121314
    

    运行结果:

    1
    1
    2
    1
    1234
    

    即使对于经验丰富的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
    12
    

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

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

    错误代码:

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

    编译错误:

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

    正确代码:

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

    12、使用“nil” Slices and Maps

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

    正确代码:

    package main
    
    func main() {
        var s []int
        s = append(s, 1)
    }
    123456
    

    错误代码:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var m map[int]int
        m[1] = 1
        fmt.Println(m)
    }
    1234567891011
    

    运行错误:

    panic: assignment to entry in nil map
    1
    

    正确代码:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var m map[int]int
        m = make(map[int]int)
        m[1] = 1
        fmt.Println(m)
    }
    123456789101112
    

    13、Map的容量

    map 只有 len操作, 没有 cap 操作

    错误代码:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        m := map[int]string{1: "a", 2: "b", 3: "c"}
        cap := cap(m)
        fmt.Println(cap)
    }
    1234567891011
    

    编译错误:

    ./main.go:9:12: invalid argument m (type map[int]string) for cap
    1
    

    正确代码:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        m := map[int]string{1: "a", 2: "b", 3: "c"}
        len := len(m)
        fmt.Println(len)
    }
    1234567891011
    

    14、字符串不会为nil

    这对于经常使用nil分配字符串变量的开发者而言是个需要注意的地方。

    package main
    
    func main() {
        var x string = nil
        if x == nil {
            x = "default"
        }
    }
    12345678
    

    编译错误:

    ./main.go:4:6: cannot use nil as type string in assignment
    ./main.go:5:7: invalid operation: x == nil (mismatched types string and nil)
    12
    

    正确代码:

    package main
    
    func main() {
        var x string
        if x == "" {
            x = "default"
        }
    }
    12345678
    
  • 相关阅读:
    ubuntu(linux)虚拟主机部署桌面,使用window链接
    扫描shader
    Android Studio快捷键
    eclipse取消空格、等号、分号自动录入
    Libgdx学习记录28——创建Desktop程序
    设计模式19——代理模式
    设计模式18——模板方法
    设计模式17——解释器模式
    设计模式16——工厂模式
    设计模式15——外观模式
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/12895997.html
Copyright © 2020-2023  润新知