14.1 Go语言代码格式、gofmt工具、配置编辑器、命名约定

2024-06-03 10:20

本文主要是介绍14.1 Go语言代码格式、gofmt工具、配置编辑器、命名约定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Go语言代码格式

代码格式指的是在语法正确的前提下,源代码的书写和组织风格。比如什么时候缩进,什么时候换行,什么时候加空格,表示块边界的花括号是跟上一行放在一起还是自己独占一行等等。这些看似无关紧要的细节其实问题颇多。

  • 代码格式常常成为程序员之间争论的主题,这些争论往往消耗大量的时间却毫无成效。
  • 在整合遵循不同风格编写的代码时,因格式混乱而导致代码晦涩难懂,甚至引入错误。
  • 阅读与自己的习惯风格迥异的代码,对任何人来说都不是一件轻松的工作,效率降低。

在代码格式方面,Go语言采取了强硬的态度,它为代码格式设置了实用而严格的约定。这些约定虽然并非强制性的,但凭借自动化的方法,最终让全天下的Go语言程序格式统一风格一致,减少了不必要的纷争,提高了工作效率。

  • 在Go语言的世界里没有人会凭借标新立异的代码风格而凌驾于格式约定之上,得不偿失。
// 糟糕的代码格式
package main;import("fmt";"strings");func main(){for i,c:=range strings.ToUpper("hello world"){if i<5{fmt.Printf("%*c%*c\n",i*2+1,c,22-(i*2+1)*2,c)}else{fmt.Printf("%*c%*c\n",22-(i*2+1),c,(i*2+1)*2-22,c)}}} 
// 打印输出:
H                   HE               EL           LL       LO   OW   WO       OR           RL               L
D                   D 

 2. gofmt工具

为了确保按照约定设置代码格式,Go语言提供了代码格式修正工具gofmt。

  • 直接对源文件使用gofmt,将格式修正的结果打印到标准输出。
    • gofmt main.go
  • -d选项(需要系统支持diff命令),显式格式修正前后的差分。
    • gofmt -d main.go
  • -w选项,用格式修正的结果覆盖原始文件
    • gofmt -w main.go

对于格式修正的结果,有些程序员可能一时难以接受,但时间终会抚平一切。

借助格式修正工具,程序员们甚至无需了解有关代码格式的任何约定,仅通过耳濡目染地影响浸润,最终自然而然地屈从于风格约定的各项要求。

// 使用gofmt格式化代码
// 为把代码调整为Go标准格式,可使用gofmt命令:gofmt -w main.go 
package main
import ("fmt""strings"
)func main() {for i, c := range strings.ToUpper("hello world") {if i < 5 {fmt.Printf("%*c%*c\n", i*2+1, c, 22-(i*2+1)*2, c)} else {fmt.Printf("%*c%*c\n", 22-(i*2+1), c, (i*2+1)*2-22, c)}}
}
// 打印输出:
H                   HE               EL           LL       LO   OW   WO       OR           RL               L
D                   D 

3. 配置编辑器

目前主流源代码编辑器都提供支持Go语言开发的第三方插件,可在保存源代码文件的同时,自动运行gofmt进行格式化修正

  • Vim - vim-go
  • Emacs - go.mode.el
  • Sublime - GoSublime
  • Atom - go-plus
  • Eclipse - goclipse
  • Visual Studio Code - vscode-go

 

4. 命名约定

有一种夸张的说法,在计算机科学里最难的两件事是缓存和命名。

好的命名有助于改善程序代码的可读性可维护性。

Go语言的命名约定有些是语法规则强制的,有些则是程序员们约定俗成的。

  • 大写字母开头的标识符是导出标识符,或叫公有标识符,可在包的外部访问,而小写字母开头的标识符则仅限于在包的内部访问,称为私有标识符。
  • 由两个或两个以上的单词组成的名称,建议采用驼峰命名法(首字母小写,私有,非导出),如:familyName,或帕斯卡命名法(首字母大写,公有,导出),如:FamilyName,不建议使用下划线连接多个单词,如:family_name。
  • 变量的声明位置距离使用位置越远,名字越长,反之越短。

Go语言的命名约定有些是语法规则强制的,有些则是程序员们约定俗成的。

  • 函数和方法中的局部变量,名字尽量短小,比如用buf表示buffer,用i表示index,甚至可以用其数据类型的首字母命名,如用b表示bool,用s表示string。
  • 函数和方法的参数及具名返回值,若其类型已具备可描述性,名字同样尽可能短小,如:func AfterFunc(d Duration, f func()) (t *Timer) { ... }// d时间间隔,f函数。
  • 良好的函数和方法名可令其功能不言而喻,如:func (t *Triangle) Area() float64 { ... }。
  • 接口名通常是在动词后面加上"er"后缀构成一个名词,表示"……者"或"……器",如:Reader(读取器)、Writer(写入器)、Parser(解析器)。
  • 从包中导出标识符,在使用时是跟在包名后面的,math.Sqrt要好过math.MathSqrt。
// 命名约定:
// 
// 1. 以大写字母开头的标识符将被导出,而以小写字母开头的不会
// 2. 多单词标识符名,使用骆驼拼写法(首字母小写)或帕斯卡拼写法(首字母大写) 
// 3. 尽量使用能体现数据类型的简短变量名
// 4. 函数和方法的命名要贴切,令其功能不言自明
// 5. 接口名通常采用动词加上“er”后缀的形式
// 6. 从包中被导出的标识符,其命名要尽量避免和包名重叠
package main
import ("fmt" "math" 
)
func main() {f := 2. fmt.Println(math.Sqrt(f))	// 1.4142135623730951 
}

 

这篇关于14.1 Go语言代码格式、gofmt工具、配置编辑器、命名约定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026710

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc