当前位置: 首页 > news >正文

Golang语法规范和风格指南(一)——简单指南

1. 前引

在这里插入图片描述

一个语言的规范的学习是重要的,直接关系到你的代码是否易于维护和理解,同时学习好对应的语言规范可以在前期学习阶段有效规避该语言语法和未知编程风格的冲突。

这里是 Google 提供的规范,有助于大家在开始学习阶段对 Golang 进行一个简单的理解和项目的创建。

https://google.github.io/styleguide/go/guide(英文版)
https://gocn.github.io/styleguide/docs/01-overview(中文版)

2. 整体原则

整体上需要遵循:清晰,简约,简洁,可维护性,一致性

我们将在下列例子中体现上面原则,帮助大家理解这些抽象原则

1. 包名称 package

我们希望使用纯小写字母去建立包名称,这时候可能有同学要问,如果这个功能隶属于某个功能下的功能不需要在功能后缀名,冲突怎么办?

  1. Java 写法
    我们在 java 中很容易就想在命名后面加类别比如UserService, 这个其实是毫无意义的后缀
  2. Golang 规范
    我们可以直接 /service/user 我们直接通过路径定位,service,同时 user 又都是小写。

这体现了 golang 的清晰和简洁

2. 常、变量命名

  1. Java 写法:
    我们在 Java 中通常使用下划线,全大写来定义常量,使用小驼峰定义变量,首单词使用大写。
  2. Golang 规范:
    我们在 golang 中同样使用驼峰进行命名,不过权限使用首字母大写来控制函数、变量是否对外部开放,在 golang 中拒绝使用不通用的缩写,通用缩写如‘api’,使用全大写命名 API

在 golang 中 变量命名长度通常和使用范围成正比,比如简单一个计数变量仅仅5行内使用,使用 count 即可,反之,如果使用更大范围的计算器,接口流量计数器,可能就需要更长的命名,如 interfaceTrafficCount,可以避免冲突和歧义。

这体现了 golang 的清晰和简约

3. 导包分组

在这里插入图片描述

导入的包最好分为两组,一组为标准库,一组为项目(其他)包

这体现了 golang 的清晰和简约、可维护性

4. 下划线导包

这个功能只建议导入初始化包的方法,因为这种导入是不可知的,维护性差的,不过下划线导包会默认执行 init()前缀的方法,主要用于一些不需要明示的初始化操作。

package mainimport (_ "fmt" // 副作用导入,仅触发 fmt 包的初始化过程
)func main() {// 这里不会直接使用 fmt 包,但 fmt 包的 init() 函数会被执行
}

像 spring 的初始化过程,包括一些核心的对象,引用的创建是不需要对外展示的,因为并不能帮助维护者理解代码,只会增加系统的复杂性。

像 . 别名导入功能,在google 推荐规范中就直接不建议使用了,没有特例

这体现了 golang 的清晰和可维护性

5. 错误处理

由于 golang 中 ,处理处理错误更为灵活,我们可以对总是成功的错误函数,不去处理错误,但是绝大多数情况,golang 还是建议去处理错误或者把错误返回给上一级
在这里插入图片描述
错误字符串通常开头小写,而日志记录通常首字母大写

这体现了 golang 的简约和可维护性

6. 字面格式化

对于在当前包之外定义的类型,结构体字面量通常应该指定字段名

// Good:
good := otherpkg.Type{A: 42}

如果能使代码更清晰,还是应该使用字段名,而且这样做是很常见的。例如,一个有大量字段的结构几乎都应该用字段名来初始化。

// Good:
okay := StructWithLotsOfFields{field1: 1,field2: "two",field3: 3.14,field4: true,
}

这体现了 golang 的简约、清晰和可维护性

7. if,for 的判断式不应该换行

// Good:
inTransaction := db.CurrentStatusIs(db.InTransaction)
keysMatch := db.ValuesEqual(db.TransactionKey(), row.Key())
if inTransaction && keysMatch {return db.Error(db.TransactionError, "query failed: row (%v): key does not match transaction key", row)
}
// Good:
for i, max := 0, collection.Size(); i < max && !collection.HasPendingWriters(); i++ {// ...
}

即使你的布尔判断式较长,也不建议换行,换行不能增加代码的美观性,且会增加阅读障碍。
这体现了 golang 的清晰和可维护性

8. switch 的 break 优化

// Good:
switch x {
case "A", "B":buf.WriteString(x)
case "C":// handled outside of the switch statement
default:return fmt.Errorf("unknown value: %q", x)
}
// Bad:
switch x {
case "A", "B":buf.WriteString(x)break // this break is redundant
case "C":break // this break is redundant
default:return fmt.Errorf("unknown value: %q", x)
}

其实刚学 Java 的时候 就感觉 case 是有点不好用的,有点反直觉,明明已经case 到值了,为什么还要向下进行, go
的字句会自动中断,说人话就是默认每个case后加了一个break,不需要我们手动加了

这体现了 golang 的清晰 主要是对 c 和 go 不明晰语意的优化

相关文章:

Golang语法规范和风格指南(一)——简单指南

1. 前引 一个语言的规范的学习是重要的&#xff0c;直接关系到你的代码是否易于维护和理解&#xff0c;同时学习好对应的语言规范可以在前期学习阶段有效规避该语言语法和未知编程风格的冲突。 这里是 Google 提供的规范&#xff0c;有助于大家在开始学习阶段对 Golang 进行一…...

数据机构记录顺序表-笔记1

一、线性表的基本概念 数据元素&#xff1a;线性表中的基本单位&#xff0c;每个元素都是线性表的一部分。 数据项&#xff1a;数据元素的具体值。 存储位置&#xff1a;线性表中的元素在内存中的具体存储位置。 线性表按存储结构可以分为顺序表和链表两大类&#xff1a; 1.1…...

考研必备~总结严蔚敏教授《数据结构》课程的重要知识点及考点

作者主页&#xff1a;知孤云出岫 目录 1. 基本概念1.1 数据结构的定义1.2 抽象数据类型 (ADT) 2. 线性表2.1 顺序表2.2 链表 3. 栈和队列3.1 栈3.2 队列 4. 树和二叉树4.1 树的基本概念4.2 二叉树 5. 图5.1 图的基本概念5.2 图的遍历 6. 查找和排序6.1 查找6.2 排序 7. 重点考…...

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国…...

Linux开发:进程间通过Unix Domain Socket传递数据

进程间传递数据的方式有很多种,Linux还提供一种特殊的Socket用于在多进程间传递数据,就是Unix Domain Socket(UDS)。 虽然通过普通的Socket也能做到在多进程间传递数据,不过这样需要通过协议栈层的打包与拆包,未免有些浪费效率,通过UDS,数据仅仅通过一个特殊的sock文件…...

Redis基础教程(九):redis有序集合

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

Servlet与Servlet容器

什么是Servlet? Servlet是Java EE&#xff08;现称Jakarta EE&#xff09;中的一个组件&#xff0c;通常用于创建动态Web内容。Servlet是运行在Web服务器上的Java程序&#xff0c;它处理客户端的请求并生成响应。Servlet的核心功能是处理HTTP请求和响应。下面是一个servlet例…...

腾讯centos mysql安装

腾讯centos mysql安装 腾讯云提供了一系列的云计算服务&#xff0c;包括操作系统、数据库、服务器等。在腾讯云上安装CentOS操作系统和MySQL数据库可以按照以下步骤进行&#xff1a; 登录腾讯云控制台&#xff08;登录 - 腾讯云&#xff09;。在控制台页面上方的搜索框中输入…...

c_各个unsigned int 和 int的取值范围

bool, uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t 取值范围分别是什么&#xff1f; 定义形式&#xff1a; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long uint64_…...

C#/WPF 自制截图工具

在日常使用电脑办公时&#xff0c;我们经常遇到需要截图然后保存图片&#xff0c;我们往往需要借助安装截图工具才能实现&#xff0c;现在我们通过C#自制截图工具&#xff0c;也能够轻松进行截图。 我们可以通过C#调用WindousAPI来实现截图&#xff0c;实例代码如下&#xff1a…...

以腾讯为例,手把手教你搭建产品帮助中心

一个精心设计的产品帮助中心对于提高用户满意度和体验至关重要。腾讯&#xff0c;作为全球领先的互联网企业&#xff0c;通过其多样化的产品线&#xff08;包括微信、QQ、腾讯游戏、腾讯视频等&#xff09;吸引了亿万用户。下面将以腾讯为例&#xff0c;向您展示如何搭建一个高…...

计算机网络概述--自我学习用

计算网络体系概述 相关问题 计算机网络为什么要分层&#xff1f;计算机网络是怎么分层的&#xff1f;三种计算机网络模型的关系是什么&#xff1f;每一层分别包含哪些协议&#xff1f;计算机网络中&#xff0c;数据如何在各层中传播&#xff1f;数据在网络各层中的存在形式是…...

超级好用的java http请求工具

kong-http 基于okhttp封装的轻量级http客户端 使用方式 Maven <dependency><groupId>io.github.kongweiguang</groupId><artifactId>kong-http</artifactId><version>0.1</version> </dependency>Gradle implementation …...

在原有的iconfont.css文件中加入新的字体图标

前言&#xff1a;在阿里图标库中&#xff0c;如果你没有这个字体图标的线上项目&#xff0c;那么你怎么在本地项目中的原始图标文件中添加新的图标呢&#xff1f; 背景&#xff1a;现有一个vue项目&#xff0c;下面是这个前端项目的字体图标文件。现在需要新开发功能页&#x…...

使用 ESP32-WROOM + DHT11 做个无屏温湿度计

最近梅雨天&#xff0c;有个房间湿度很大&#xff0c;而我需要远程查看温湿度&#xff0c;所以无所谓有没有显示屏&#xff0c;某宝上的温湿度计都是带屏的&#xff0c;如果连WIFI查看温湿度操作也比较麻烦&#xff0c;还需要换电池&#xff0c;实在不能满足我的需求&#xff0…...

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…...

InspireFace-商用级的跨平台开源人脸分析SDK

InspireFace-商用级的跨平台开源人脸分析SDK InspireFaceSDK是由insightface开发的⼀款⼈脸识别软件开发⼯具包&#xff08;SDK&#xff09;。它提供了⼀系列功能&#xff0c;可以满⾜各种应⽤场景下的⼈脸识别需求&#xff0c;包括但不限于闸机、⼈脸⻔禁、⼈脸验证等。 该S…...

华为HCIP Datacom H12-821 卷24

1.单选题 企业大楼有大量员工通常都在上班时在大厅开始接入到公司的WLAN网络,随着每位员工走到各自的工位过程中,每个人的移动端叶通过漫游的方式漫游到各自的网络覆盖区域。为了尽量保证每个终端的IP地址是固定的,建议的做法是? A、配置VLAN Pool并配置顺序算法 B、…...

TikTok马来西亚直播网络怎么配置?

TikTok是一款全球流行的社交媒体应用&#xff0c;在东南亚地区拥有大量用户。在马来西亚这个多元化的国家&#xff0c;配置高效稳定的直播网络对TikTok的运营至关重要。 配置马来西亚直播网络的必要性 广泛的地理覆盖&#xff1a;马来西亚包括大片陆地和众多岛屿&#xff0c;网…...

基于若依的文件上传、下载

基于若依实现文件上传、下载 文章目录 基于若依实现文件上传、下载1、前端实现-文件上传1.1 通用上传分析1.2 修改实现上传接口 2、后端实现-文件上传3、后端实现-文件下载4、前端实现-文件下载 官网其实也写了&#xff0c;但是我是自己改造封装了一下&#xff0c;再次迈向全栈…...

2026 年 OpenClaw 生态选型指南:从「红色龙虾」到国产「小龙虾」

2026 年初&#xff0c;一只名为 OpenClaw 的「红色龙虾」长期占据 GitHub 热度前列&#xff0c;星标在公开页面上已达到 三十万量级&#xff08;具体数字每日波动&#xff09;。业界常把它描述为 AI 从「只会聊」走向「能替你办事」的一块试金石&#xff1a;不是多一个聊天窗口…...

Linux栈机制解析:进程栈、线程栈与内核栈

Linux系统中的栈机制深度解析&#xff1a;进程栈、线程栈、内核栈与中断栈1. 栈的基本原理与硬件实现栈(Stack)是一种后入先出(LIFO)的串列数据结构&#xff0c;在计算机体系结构中具有重要作用。硬件层面&#xff0c;大多数处理器架构都实现了专门的栈机制&#xff1a;栈指针寄…...

6表单全链路工程化AI开发体系使用方案

6表单全链路工程化AI开发体系使用方案 一、体系整体概述 核心定位与价值 本方案对应的6个表单,是一套覆盖项目启动→需求收敛→标准前置→开发执行→风险管控→验收闭环全流程的工程化AI人机协同管控体系,核心解决AI辅助开发中「需求模糊→AI输出偏离→反复返工→交付失控」的…...

Hive【从SQL到MapReduce:核心架构与执行引擎深度解析】

1. Hive的核心角色&#xff1a;SQL到分布式计算的翻译官 第一次接触Hive时&#xff0c;很多人会疑惑&#xff1a;为什么要在Hadoop生态中引入这样一个"类SQL"工具&#xff1f;这要从大数据处理的痛点说起。想象你面前有一本百万页的百科全书&#xff0c;现在需要统计…...

ASan实战:5种常见内存错误诊断与修复指南(附GCC/Clang编译命令)

ASan实战&#xff1a;5种常见内存错误诊断与修复指南&#xff08;附GCC/Clang编译命令&#xff09; 在C/C开发中&#xff0c;内存错误如同潜伏的暗礁&#xff0c;随时可能让程序沉没。AddressSanitizer&#xff08;ASan&#xff09;作为Google推出的内存错误检测工具&#xff…...

VSCode调试ARM芯片:一份给硬件工程师的OpenOCD与J-Link配置清单

VSCode调试ARM芯片&#xff1a;一份给硬件工程师的OpenOCD与J-Link配置清单 当硬件工程师第一次将ARM Cortex-M开发板连接到电脑时&#xff0c;最令人沮丧的莫过于看着闪烁的LED却无法窥探芯片内部的运行状态。调试器就像硬件工程师的"听诊器"&#xff0c;而VSCode配…...

终极指南:如何用F3工具快速检测U盘和SD卡真实容量

终极指南&#xff1a;如何用F3工具快速检测U盘和SD卡真实容量 【免费下载链接】f3 F3 - Fight Flash Fraud 项目地址: https://gitcode.com/gh_mirrors/f3/f3 在数字时代&#xff0c;存储设备容量造假已成为普遍问题&#xff0c;许多U盘、SD卡通过软件修改显示虚假容量&…...

告别数据洪流:手把手教你用ZCANPRO的视图筛选与实时曲线功能高效分析CAN报文

告别数据洪流&#xff1a;手把手教你用ZCANPRO的视图筛选与实时曲线功能高效分析CAN报文 在车载电子和嵌入式开发领域&#xff0c;CAN总线数据的分析工作常常让工程师们头疼不已。想象一下&#xff0c;当你的测试设备捕获到成千上万条CAN报文时&#xff0c;如何从中快速定位到关…...

Unity Input System手势识别避坑指南:为什么你的双指缩放总是不跟手?

Unity Input System手势识别避坑指南&#xff1a;为什么你的双指缩放总是不跟手&#xff1f; 当你在Unity中实现双指缩放功能时&#xff0c;是否遇到过这样的问题&#xff1a;用户手指明明在屏幕上流畅滑动&#xff0c;但画面却像卡顿了一样&#xff0c;或者缩放比例突然跳变&a…...

PyTorch模型参数与元数据安全存储:safetensors实战解析

1. 为什么需要safetensors存储模型参数&#xff1f; 在深度学习项目中&#xff0c;模型参数的保存和加载是最基础也最频繁的操作。传统PyTorch开发者习惯使用torch.save和torch.load这对黄金组合&#xff0c;直到某天我在分布式训练集群上遇到了一个诡异的问题&#xff1a;一个…...