如何在Go中支持Allman Style编码?

gre*_*olf 10 coding-style go

在我用其他语言工作的所有项目中,支撑风格的选择是Allman Style(又名ANSI风格).在Go中工作时,缺少自由形式的支撑样式(括号也是)我从其他C语言语法系列中遗漏的东西.

任何人都可以想出一种让Go编译器接受以下支撑风格的方法吗?

package main

import "fmt"

func main() 
{
    f()
    fmt.Println("Returned normally from f.")
}

func f() 
{
    fmt.Println("In function f.")
}
Run Code Online (Sandbox Code Playgroud)

注意我知道为什么Go设计有这样的人为"限制"的论据,但我并没有真正购买它.我坚信,所使用的支撑式风格应该真正由在代码库上工作的人或公司所采用的编码标准来决定,而不是被语言本身所强迫.

因此,请在"如何做"的范围内考虑我的问题,而不是"为什么不去做,只是适应".

谢谢

Neu*_*ino 8

我把括号加倍.

if x < 0 {
{
    return sqrt(-x) + "i"
}}
Run Code Online (Sandbox Code Playgroud)

它不是理想的,但比尝试扫描1-120列匹配括号更好.


小智 7

这可能不是您正在寻找的,但这是一种可能的方式.

你可以编写一个'翻译程序',本质上是一个非常简单的编译器,可以将你编写的内容,有效的Go变量转换为Go编译器本身所期望的内容.

你可以用一些程序,甚至是shell脚本来做到这一点,它将正则表达式的/(\n)$ ^\s*{/ {\ 1/g'应用于整个程序(尽管它会需要查看文件的完整字符串而不是逐行分解,因此您不能将该表达式作为参数传递给sed,例如).然后将转换后的文件写入临时文件,并在其上运行Go编译器.

这种方法的优点是不需要对Go本身进行任何更改,但缺点是如果没有额外的脚本,您的文件将无法编译.如果您通常使用Makefile,这可能很好,但有时可能仍然不方便.


Jon*_*ler 6

简洁,没有.该语言是(或者是一年或更久以前)用分号定义的,并且编译器隐含地在行的末尾插入分号 - 除非在行的末尾有一个括号.所以,如果你写了一个条件(不需要括号,请注意)并且不要在行的末尾放置一个开括号,然后Go编译器为你插入一个 - 在if和之后留下一个空语句,并且括起一个无条件执行的块的括号.

@epw建议重新格式化; 我认为这是一个合理的建议.Go随附gofmt转换为规范的Go风格.您必须编写一些内容以从规范转换为Allman样式,反之亦然,并确保在将Go-Allman源编译为目标文件之前将其预编译为Go-canonical格式.总的来说,这比接受Go有自己的规则更具创伤性,这些规则不再比Python的规则更古怪,并且最简单的流程并接受Go中的编码涉及非Allman编码(大约K&R)样式.(我喜欢并在C中使用Allman风格;我在Go中使用Go风格.)


diy*_*ism 2

尝试一下https://gofork.org

forkgo 支持 allman/horstmann 风格:

package main
import
(   "fmt"
)


func main()
{   if false
    {   fmt.Println("jack")
        fmt.Println("forkgo")
    } else
    {   fmt/
           .Println("hello")
        fmt.Println("forkgo")
    }
}
Run Code Online (Sandbox Code Playgroud)