广告
返回顶部
首页 > 资讯 > 精选 >Go编码规范有哪些
  • 273
分享到

Go编码规范有哪些

2023-07-04 18:07:50 273人浏览 安东尼
摘要

本文小编为大家详细介绍“Go编码规范有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go编码规范有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 代码风格1.1 代码格式代码必须用 gofmt 进行

本文小编为大家详细介绍“Go编码规范有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go编码规范有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1. 代码风格

1.1 代码格式
  • 代码必须用 gofmt 进行格式化,goland 可以配置,可以自行搜索一下配置

  • 我们编写的代码每行应该不超过 120 个字符,超出部分用换行解决。

  • 单个文件最大行数最大不超过 800 行.

  • 单个函数最大行数不超过 80 行。

  • import 规范

    • 不要使用相对路径引入包,例如 import ../util/net

    • 在导入包时,多个相同包名冲突时,必须使用导入别名

// bad"GitHub.com/google/uuid"// gooduuid "github.com/google/uuid"
  • 导入的包建议分组,引用匿名包建议用一个新的分组,并加上注释方便后面小伙伴阅读

import (    // Go 标准库    "fmt"    //第三方包    "github.com/jinzhu/gORM"    "github.com/google/uuid"    "github.com/go-redis/Redis/v8"    // 匿名包    /import mysql driver    _"github.com/jinzhu/gorm/dialects/Mysql"    // 内部包    slice "xxx.local/pkg/v1/goslice"    meta "xxx.local/pkg/v1/meta"    gomap "xxx.local/pkg/v2/gomap")
1.2 声明、初始化和定义
  • 一个函数需要使用多个变量时,可以在函数最开头处使用 var 声明。在函数外部声明的变量不能使用 :=

var (    port = 8081    metricServerPort = 2001)
  • 在初始化结构体用 &struct 代替 new(struct),确保与结构体初始化一致,初始化结构体时换行。

// badstu := new(S)stu.Name = "张三"// goodstu := &S{    Name:"李四"}
  • 使用 make 在声明 map、array 等应该指定容器的容量,从而达到预先分配内容。

users := make(map[int]string, 10)tags := make([]int, 0, 10)
  • 使用标准 var 关键字事,不要指定类型,除非它与表达式的类型不同。

// badvar _f string F()func F() string {    return "hello world!"}// good var _f F()func F() string {    return "hello world!"}
1.3 error 处理
  • 若函数返回 error, 必须对 error 进行处理,如果业务允许可以用 _ 接受忽略。对应 defer 可以不用显式进行处理。

// badfunc InitConfig() error {    ...}InitConfig()// goodfunc InitConfig() error {    ...}err := InitConfig()if err != nil {    ...}// or _ := InitConfig()
  • error 作为返回值时必须作为最后一个参数返回

// badfunc InitConfig() (error,int) {    ...}// good func InitConfig() (int, error) {    ...}
  • 错误需要单独处理,尽量不要与其他的逻辑耦合在一起。

// badres, err := InitConfig()if err != nil || res != nil {    return err}// goodres, err := InitConfig()if err != nil {    return err}if res != nil {    return fmt.Errorf("invalid result")}
1.4 panic处理
  • 业务代码中禁止抛出 panic 错误。

  • panic 只允许出现在在服务启动之前,如读取配置、链接存储(redis、mysql 等)。

  • 业务代码中建议用 error 而不是 panic 来传递。

1.5 单元测试
  • 每个重要的函数都要编写测试用例,合并代码要自动化运行一下所有的 test。

  • 文件命名 xxx_test.go。

  • 函数命名建议使用 Test函数名。

2. 命名规范

在每个语言中,命名规范在代码规范中非常重要,一个统一的、精确的命名不仅仅可以提高代码的可读性,也可以让人觉的这个同志真的会呀。牛!

2.1 包命名规范
  • 包名必须与目录名一致(这和其他 PHP、Java 还是有一点不太一样的),尽量采取有意义、简短的包名,不要与 go 的标准库名称一样。

  • 包名小写,没有下划线,可以使用中划线隔开,使用多级目录来划分目录。

  • 包名不要出现复数命名。

  • 包名命名尽量简单一目了然,ge:user、log。

2.2 文件命名规范
  • 文件名要见名思义,尽量简而短

  • 文件名小写,组合词用下划线分割

2.3 函数命名规范
  • php、Java 一样,必须遵循驼峰规范,Go 语言中需要根据访问的控制决定大驼峰还是小驼峰。

  • 单元测试的函数用大驼峰,TestFunc。

2.4 结构体命名规范
  • 与 php、Java 一样,必须遵循驼峰规范,Go 语言中需要根据访问的控制决定大驼峰还是小驼峰。

  • 避免使用 info 、data 这种无意义的名称。

  • 命名使用名词而非动词。

  • 结构体在声明和初始化的时候需要换行,eg:

type Student struct{    Name string    Age uint8}student := Student{    Name: "张三",    Age: 18,}
2.5 变量命名规范
  • 和 php、Java 一样,必须遵循驼峰规范,Go 语言中需要根据访问的控制决定大驼峰还是小驼峰。

  • 若变量为私有时,可以使用小写命名。

  • 局部变量可以简写,eg:i 表示 index。

  • 若变量代表 bool 值,则可以使用 Is 、Can、Has 前缀命名,eg:

var isExit boolvar canReturn bool
2.6 常量命名规范
  • 必须遵循驼峰规范,Go 语言中需要根据访问的控制决定大驼峰还是小驼峰。

  • 若代表枚举值,需要先创建。

type Code intconst (    ErrNotFound Code = iota    ErrFatal)

3. 类型

3.1 字符串

好像学过的语言中,都是从字符串开始说起的。就像写代码第一行都是从 Hello World!一样!同意的点赞哈。

  • 字符串判空值

// badif s == "" {    ...} // good if len(s) == 0 {    ...}
  • 字符串去除前后子串。

// badvar s1 "hello world"var s2 "hello"var s3 strings.TrimPrefix(s1, s2)// goodvar s1 "hello world"var s2 "hello"var s3 stringif strings.HasPrefix(s1, s2){    s3 = s1[len(s2):]}
3.2 切片 slice
  • 声明 slice。

// bads := []string{}s := make([]string, 10)// goodvar s []strings := make([]string, 0, 10)
  • 非空判断。

//badif len(slice) >0 {    ...} // good if slice != nil && len(slice) > 0 {    ...}
  • slice copy。

// badvar b1,b2 []bytefor i, v := range b1 {    b2[i] = v}for i := range b1 {    b2[i] = b1[i]}// goodcopy(b2,b1)
  • slice 新增。

// badvar a,b []intfor _, v := range a {    b = append(b,v)}// goodvar a, b []intb := append(b, a...)
3.4 结构体 struct
  • 初始化需要多行。

type Student struct{    Name string    Age uint8}student := Student{    Name: "张三",    Age: 18,}

4. 控制语句

4.1 if
  • if 可以用局部变量的方式初始化。

if err := InitConfig; err != nil {    return err}
4.2 for
  • 不允许在 for 中使用 defer, defer 只在函数结束时才会执行。

// badfor file := range files {    fd, err := os.Open(file)    if err != nil {        return err    }    defer fd.close()}// good    for file := range files{    func() {        fd,err := os.open(file)        if err!=nil {            return err        }        defer fd.close()    }()}
4.3 range
  • 如果不需要 key 直接用 _ 忽略,value 也一样。

for _, v := range students {    ...}for i, _ := range students {    ...}for i, v := range students {    ...}

注: 若操作指针时请注意不能直接用 s := v。想知道可以评论区告诉我哦!

4.4 switch
  • 和其他语言不一样,必须要有 defalt

switch type {    case 1:        fmt.Println("type = 1")        break     case 2:        fmt.Println("type = 2")        break     default :        fmt.Println("unKnown type")}
4.5 goto
  • 业务中不允许使用 goto。

  • 框架和公共工具也不允许使用 goto。

5. 函数

  • 传参和返回的变量小写字母。

  • 传入参数时slice、map、interface、chan 禁止传递指针类型。

  • 采用值传递,不用指针传值。

  • 入参个数不能超出 5 个,超过的可以用 struct 传值。

5.1 函数参数
  • 返回值超出 1 个时,需要用变量名返回。

  • 多个返回值可以用 struct 传。

5.2 defer
  • 当操作资源、或者事物需要提交回滚时,可以在创建开始下方就使用 defer 释放资源。

  • 创建资源后判断 error,非 error 情况后在用 defer 释放。

5.3 代码嵌套
  • 为了代码可读性,为了世界和平,尽量别用太多的嵌套,因为真的很难有人类能看懂。

6. 日常使用感悟

  • 能不用全局变量就不用,可以用参数传值的方式,这样可以大大降低耦合,更有利于单元测试。

  • 衣服开发中,在函数间多用 context 传递上下文,在请求开始时可以生成一个 request_id,便于链路、日志追踪。

6.1 提高性能
  • 在业务开发中,尽量使用 strconv 来替代 fmt。

  • 我们在使用 string 字符串类型时,当修改的场景较多,尽量在使用时用 []byte 来替代。因为每次对 string 的修改都需要重新在申请内存。

6.2 避免踩坑
  • append 要小心自动扩容的情况,最好在申明时分配好容量,避免扩容所带来的性能上的损耗以及分配新的内存地址。若不能确定容量,应选择一个比较大一点的值。

  • 并发场景下,map 非线程安全,需要加。还有一种评论区告诉我吧。

  • interface 在编译期间无法被检查,使用上会出现 panic,需要注意

读到这里,这篇“Go编码规范有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Go编码规范有哪些

本文链接: https://www.lsjlt.com/news/346839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go编码规范有哪些
    本文小编为大家详细介绍“Go编码规范有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go编码规范有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 代码风格1.1 代码格式代码必须用 gofmt 进行...
    99+
    2023-07-04
  • go语言的注释编码规范有哪些
    这篇文章主要介绍“go语言的注释编码规范有哪些”,在日常操作中,相信很多人在go语言的注释编码规范有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言的注释编码规范有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • VB.NET编码规范有哪些
    今天就跟大家聊聊有关VB.NET编码规范有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、类型级单位的命名 类。 以Class声明的类,都必须以名词或名词短语命名,体现类的作用...
    99+
    2023-06-17
  • Python编码规范有哪些
    Python编码规范有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。编码在Python编码规范中,所有的 Python 脚本文件都应在文件头标上 # -*- codin...
    99+
    2023-06-17
  • VB.NET有哪些编码规范
    本篇文章为大家展示了VB.NET有哪些编码规范,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、类型级单位的命名类。以Class声明的类,都必须以名词或名词短语命名,体现类的作用。如:Class I...
    99+
    2023-06-17
  • JavaScript的编码规范有哪些
    本篇文章给大家分享的是有关JavaScript的编码规范有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JavaScript 文件引用Ja...
    99+
    2022-10-19
  • .Net Framework编码规范有哪些
    .Net Framework编码规范有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。.Net Framework编码规范:·委托类型的名称都应该以EventHandle...
    99+
    2023-06-17
  • Kitty-Cloud编码规范有哪些
    本篇文章给大家分享的是有关Kitty-Cloud编码规范有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。API 层autoconfigure:自动配置包名,类名以 Auto...
    99+
    2023-06-03
  • Python基本编码规范有哪些
    这篇“Python基本编码规范有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python基本编码规范有哪些”文章吧。P...
    99+
    2023-06-29
  • HTML/CSS/JS编码规范有哪些
    这篇文章主要讲解了“HTML/CSS/JS编码规范有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML/CSS/JS编码规范有哪些”吧!一、HTML...
    99+
    2022-10-19
  • XHTML编码基本规范有哪些
    这篇文章主要介绍了XHTML编码基本规范有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、所有的标记都必须要有一个相应的结束标记 &n...
    99+
    2022-10-19
  • Java 程序编码规范有哪些
    这篇文章给大家介绍Java 程序编码规范有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java 程序编码的规范(转)[@more@]所有的程序开发手册都包含了各种规则。一些习惯自由程序人员可能对这些规则很不适 应...
    99+
    2023-06-03
  • C#中有哪些.NetFramework编码规范
    本篇文章给大家分享的是有关C#中有哪些.NetFramework编码规范,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。.Net Framework中的委托与事件尽管很多范例都能...
    99+
    2023-06-17
  • Python中的编码规范有哪些
    这篇“Python中的编码规范有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的编码规范有哪些”文章吧。编...
    99+
    2023-07-06
  • JavaScript编码规范知识点有哪些
    这篇文章主要介绍“JavaScript编码规范知识点有哪些”,在日常操作中,相信很多人在JavaScript编码规范知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • Bootstrap CSS语法编码规范有哪些
    这篇文章主要讲解了“Bootstrap CSS语法编码规范有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Bootstrap CSS语法编码规范有哪些”...
    99+
    2022-10-19
  • 有哪些前端安全编码规范
    本篇内容主要讲解“有哪些前端安全编码规范”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些前端安全编码规范”吧!1. 跨站脚本攻击(Cross Sites S...
    99+
    2022-10-19
  • JavaScript编程语言的编码规范有哪些
    小编给大家分享一下JavaScript编程语言的编码规范有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JavaScript 编码规范建议本文就 JavaSc...
    99+
    2023-06-27
  • Android编程规范有哪些
    今天就跟大家聊聊有关Android编程规范有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。命名规则1). 类名,接口名:以大写开头,如果一个类的类名由多个单词组成,所有单词的首字...
    99+
    2023-06-17
  • javascript编写规范有哪些
    这篇文章主要讲解了“javascript编写规范有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript编写规范有哪些”吧!通用规范文件编码...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作