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

时间:2011-06-11 00:23:19

标签: 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.")
}

注意我知道为什么Go设计有这种人为的“限制”的论据,但我并没有真正购买它。我坚信,所使用的支撑式风格应该完全取决于代码库中工作的人或公司所采用的编码标准,而不是被语言本身所强迫。

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

由于

4 个答案:

答案 0 :(得分:7)

我把括号加倍。

if x < 0 {
{
    return sqrt(-x) + "i"
}}

这不是理想的,但比尝试扫描列1-120以匹配大括号更好。

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

试试https://github.com/forkgo-org/go

forkgo 支持这样的样式:

package main
import
(
    "fmt"
)


func main()
{
    if false
    {   fmt.Println("jack")
        fmt.Println("forkgo")
    } else
    {   fmt/
           .Println("hello")
        fmt.Println("forkgo")
    }
}