
go语言的设计哲学之一是强调代码风格的统一性,这主要通过其官方格式化工具gofmt来实现。gofmt会自动将go源代码格式化为标准风格,其中就包括了对括号放置的严格规定。在go中,控制流语句(如if、for、func等)的开括号{必须紧随语句的末尾,与语句在同一行,这被称为k&r风格(或one true brace style)。
例如,一个典型的Go函数或if语句会是这样的:
package main
import "fmt"
func main() { // K&R 风格:开括号与func在同一行
fmt.Println("Hello, Go!")
if true { // K&R 风格:开括号与if在同一行
fmt.Println("This is true.")
}
}当开发者尝试使用Allman风格(开括号在新行)编写代码时,gofmt会自动将其格式化回K&R风格。
// 开发者期望的Allman风格
func main()
{ // Allman 风格:开括号在新行
fmt.Println("Hello, Go!")
}
// 经过gofmt格式化后,会变成K&R风格
func main() {
fmt.Println("Hello, Go!")
}这种强制统一的风格旨在减少团队协作中的格式争议,提高代码的可读性和一致性。然而,对于习惯其他语言(如C#、Java等)Allman风格的开发者来说,这可能是一个难以适应的“限制”。
尽管Go语言本身和gofmt强烈推崇K&R风格,但如果开发者执意要在视觉上模拟Allman风格,可以采用一种非标准的“双层括号”技巧。这种方法的核心思想是利用Go语言允许在代码块内嵌套代码块的特性。
立即学习“go语言免费学习笔记(深入)”;
实现原理:
gofmt强制要求控制流语句的开括号紧随其后。但它不会对一个独立的代码块(即没有关联任何控制流语句的纯{}块)的内部进行额外的格式化约束,只要这个块本身是合法的。因此,我们可以在K&R风格的开括号内部,再手动添加一个开括号并将其放置在新行,以模拟Allman风格的视觉效果。
示例代码:
让我们以一个函数为例,演示如何应用双层括号技巧:
package main
import "fmt"
func main() { // Go语言强制的K&R风格开括号
{ // 模拟Allman风格的开括号
f()
fmt.Println("Returned normally from f.")
}} // 模拟Allman风格的闭括号,然后是Go语言强制的闭括号
func f() { // Go语言强制的K&R风格开括号
{ // 模拟Allman风格的开括号
fmt.Println("In function f.")
}} // 模拟Allman风格的闭括号,然后是Go语言强制的闭括号
func conditionalExample(x int) { // Go语言强制的K&R风格开括号
{ // 模拟Allman风格的开括号
if x < 0 { // Go语言强制的K&R风格开括号
{ // 模拟Allman风格的开括号
fmt.Println("x is negative.")
}} // 模拟Allman风格的闭括号,然后是Go语言强制的闭括号
fmt.Println("End of conditionalExample.")
}} // 模拟Allman风格的闭括号,然后是Go语言强制的闭括号解释:
通过这种方式,代码在经过gofmt处理后,最外层的K&R风格括号会保持不变,而内部手动添加的括号则可以按照Allman风格放置,从而达到视觉上的近似效果。
虽然“双层括号”技巧可以在视觉上满足Allman风格的需求,但它并非Go语言的惯用法,并且存在一些明显的局限性和潜在问题:
在Go语言中强制使用Allman风格的括号是一个与语言设计理念和社区惯例相悖的需求。尽管通过“双层括号”这种变通方法可以在视觉上模拟Allman风格,但它带来了代码可读性降低、增加嵌套层级以及与Go语言惯用风格不符等问题。
对于个人项目,开发者可以自行决定是否采用这种方法。然而,在任何形式的团队协作或开源项目中,强烈建议遵循Go语言的官方风格指南,使用gofmt进行代码格式化,并适应K&R风格的括号放置。这不仅能确保代码的一致性和可读性,也有助于更好地融入Go语言社区。适应语言本身的习惯,往往比强行改变其外观更能提高开发效率和代码质量。
以上就是在Go语言中实现Allman风格括号的变通方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号