6

为什么 Go 语言只允许一种大括号放置风格? — blog.huangz.me

 3 years ago
source link: https://blog.huangz.me/2020/go-brace-style.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

为什么 Go 语言只允许一种大括号放置风格?

本文摘录自《Go语言趣学指南》第 1 章, 请访问 gpwgcn.com 以获取更多相关信息。

../_images/gpwgcn1.jpg

代码清单 1-1 与 Go Playground 的初次见面: playground.go

package main                            // 声明本代码所属的包

import (
    "fmt"                               // 导入 fmt 包,使其可用(fmt是format的缩写)
)

func main() {                           // 声明一个名为 main 的函数
    fmt.Println("Hello, playground")    // 在屏幕上打印出“Hello, playground”
}

../_images/kongfu_gopher1.jpg

Go 对于大括号 {} 的摆放位置非常挑剔。 在代码清单 1-1 中,左大括号 {func 关键字位于同一行,而右大括号 } 则独占一行。 这是 Go 语言唯一允许的大括号放置风格,除此之外的其他风格都是不被允许的。 作为参考,mng.bz/NdE2 展示了各种不同的大括号放置风格。

Go 之所以如此严格地限制大括号的放置风格,跟这门语言刚刚诞生时发生的一些事情有关。 在早期,使用 Go 编写的代码总是无一幸免地带有分号,它们就像迷路的小狗一样跟在每条单独的语句后面,比如这样:

fmt.Println("Hello, fire hydrant");

到了 2009 年 12 月,一群忍者 gopher 决定把分号从语言中驱逐出去。 好吧,这么说也不太准确。 实际上,Go 编译器将为你代劳,自动地插入那些可爱的分号。 这种机制运行得非常完美,但它的代价就是要求用户必须遵守上面提到的唯一无二的大括号放置风格

如果用户尝试将左大括号和 func 关键字放在不同的行里面,那么 Go 将报告一个语法错误:


func main()      // 函数体缺失
{                // 语法错误:在 { 之前发现了意料之外的分号或新行
}

出现这个问题并不是编译器有意刁难,这纯粹是由于分号被插入到了错误的位置,导致编译器犯了点小迷糊,最终才不得不求助于你。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK