讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

在Go语言中实现Allman风格括号的变通方法

夏晨大大_3785

夏晨大大_3785

发布时间:2025-08-02 15:04:21

|

713人浏览过

|

来源于php中文网

原创

在Go语言中实现Allman风格括号的变通方法

Go语言的标准格式化工具gofmt强制执行K&R风格的括号放置,即开括号与语句在同一行。对于习惯Allman风格(开括号在新行)的开发者而言,这可能带来不适。本文将探讨一种非标准但可行的变通方法,通过“双层括号”技巧,在满足gofmt格式要求的同时,视觉上模拟Allman风格,并分析其实现原理、代码示例及潜在的注意事项。

Go语言的惯用括号风格与gofmt

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风格的视觉效果。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

示例代码:

让我们以一个函数为例,演示如何应用双层括号技巧:

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语言强制的闭括号

解释:

  1. func main() {:这是gofmt强制的K&R风格的函数开括号。
  2. {:这是我们手动添加的、在新行放置的开括号,它形成了一个新的、独立的匿名代码块。这个括号在视觉上扮演了Allman风格的开括号角色。
  3. }:这是与我们手动添加的开括号配对的闭括号,也放置在新行,视觉上扮演Allman风格的闭括号。
  4. }:这是与func main() {配对的闭括号,它必须紧随其内部代码块的闭括号之后,以满足gofmt的要求。

通过这种方式,代码在经过gofmt处理后,最外层的K&R风格括号会保持不变,而内部手动添加的括号则可以按照Allman风格放置,从而达到视觉上的近似效果。

注意事项与局限性

虽然“双层括号”技巧可以在视觉上满足Allman风格的需求,但它并非Go语言的惯用法,并且存在一些明显的局限性和潜在问题:

  1. 非Go语言惯用风格: 这种写法与Go社区普遍接受和使用的风格背道而驰。在团队协作中,这会降低代码的可读性,增加维护成本,并可能引发不必要的争议。
  2. 增加代码嵌套层级: 引入额外的代码块会增加逻辑上的嵌套层级,即使这些块没有实际的语义作用。这可能使代码看起来更复杂,尤其是在已经有多层嵌套的情况下。
  3. 潜在的混淆: 对于不熟悉这种技巧的Go开发者来说,额外的括号可能会引起困惑,不清楚其意图和作用。
  4. 不适用于所有情况: 这种方法主要适用于函数体、if、for等语句的整体代码块。对于一些更复杂的表达式或链式调用,可能无法完美应用。
  5. 不解决根本问题: 这仅仅是一种视觉上的妥协,并未改变Go语言对括号放置的底层要求。开发者仍然需要理解并遵循gofmt的规则。

总结

在Go语言中强制使用Allman风格的括号是一个与语言设计理念和社区惯例相悖的需求。尽管通过“双层括号”这种变通方法可以在视觉上模拟Allman风格,但它带来了代码可读性降低、增加嵌套层级以及与Go语言惯用风格不符等问题。

对于个人项目,开发者可以自行决定是否采用这种方法。然而,在任何形式的团队协作或开源项目中,强烈建议遵循Go语言的官方风格指南,使用gofmt进行代码格式化,并适应K&R风格的括号放置。这不仅能确保代码的一致性和可读性,也有助于更好地融入Go语言社区。适应语言本身的习惯,往往比强行改变其外观更能提高开发效率和代码质量。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

3409

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

6827

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

782

2023.10.13

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

8625

2023.10.26

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3236

2024.02.23

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3484

2024.02.23

go语言开发工具大全
go语言开发工具大全

本专题整合了go语言开发工具大全,想了解更多相关详细内容,请阅读下面的文章。

7659

2025.06.11

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

4857

2025.06.26

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn