代码之家  ›  专栏  ›  技术社区  ›  Viraj Agarwal

为什么我的golang代码中没有出现识别错误?

  •  -5
  • Viraj Agarwal  · 技术社区  · 11 月前

    我这里有他的代码,我写的是为了了解golang。现在,我在“b:=2”行处放置了一个缩进。但是,编译器根本没有给出错误,而是正常运行程序。我以前用过Python,所以这对我来说很奇怪。我在网上找不到一个关于golang如何使其工作而不出错的原因。你能解释一下为什么golang编译器可以接受这一点吗?

    package main
    
    import "fmt"
    
    func main()  {
        a := 1
            b := 2
        fmt.Println(a,b)
    }
    

    我脑海中的想法:

    没有分号来结束行,所以代码的格式非常严格。

    尝试

    1. 试图在网上搜索这种行为的原因,但被各种其他语言的缩进错误解决链接淹没了。
    2. 此外,我还尝试在其他golang代码中添加这种随机缩进,但仍然没有出现任何错误。

    预期

    在我放置随机压痕的那条线上得到压痕误差。

    注:

    当我尝试使用Ctrl+S命令保存时,VS code(我使用的IDE)中的Golang代码格式化程序确实会删除这些缩进,但当我专门将代码复制到纯文本编辑器中并从那里保存,然后运行go代码时。编译器仍然没有给出任何错误。

    2 回复  |  直到 11 月前
        1
  •  1
  •   ruakh    11 月前

    Python至少以两种不同的方式使用空格:

    1. 它使用换行符来分隔语句。
    2. 它使用缩进来指示块体。

    #2依赖于#1缩进依赖于换行符,因为缩进的整个概念是它位于行首,但#1不依赖于#2:我们可以想象一种语言,它使用换行符来分隔语句,但使用花括号或其他符号来表示块体。

    . . . 除了我们甚至不必想象它,因为正如你所注意到的,Go是一种语言!

    其他此类语言包括JavaScript和POSIX shell(如Bash)。

    (所有这些语言 支持用分号分隔语句,既可以代替换行符,也可以与换行符一起分隔,但换行符本身就足够了。)

        2
  •  0
  •   eik    11 月前

    Go编译器看到标记器插入的分号。你不必打字, Go编程语言规范:分号 says :

    Go程序可能会省略这些分号中的大部分[…]

    […]分号会在行的最后一个标记后立即自动插入到标记流中

    […]结尾“)”或“}”前可以省略分号

    因此,这些分号由标记器自动插入(标记器看到行的末尾,可能会插入分号)。你会在一行代码中看到一些分号,打赌这些很少见( Go Playground ):

    package main
    
    import "fmt"
    
    func main() {
        world := func() string { name := "world"; return name }
        fmt.Println("Hello,", world())
    }
    

    Python使用 logical lines :

    逻辑行的末尾由标记NEWLINE表示。语句不能跨越逻辑行边界,除非语法允许NEWLINE(例如,复合语句中的语句之间)。

    所以标记器的工作方式不同 NEWLINE 是的一部分 Python language specification ,虽然它不在Go中。