Golang开发习惯:变量、常量声明使用惯例

news2024/9/21 12:22:36

在这里插入图片描述

《Go语言精进之路》第二、三章部分内容学习记录笔记。

1.基本原则

Golang开发中,可遵守简单且一致的命名原则,力求命名精简、易懂和一致。

  • package声明
    Golang的package声明以小写形式的单个词进行命名:
shopservice、utils、logs、tcc、logconfigs、encoding    [good]

不建议以复合词形式来命名:

shop_service、log_configs    [bad]
  • 变量声明
    已存在类型信息时,不要重复类型信息:
users []*User    [good]
userList []*User     [bad]

使用驼峰形式来声明变量,而不是下划线形式:

var userInfo *User    [good]
var user_info *User    [bad]
  • 常量声明
    使用驼峰形式来声明变量,而不是下划线形式:
const (
    TaskTypeA = "A"    [good]
    Task_Type_B = "B"    [bad]
)

对于专有名词或特定常量,可使用全大写形式:

const (
    SIGABRT = Singnal(0x6)    [good]
    SIGALRM = Singnal(0xe)    [good]
    sig_abrt = Singnal(0x6)    [bad]
)
  • 接口声明
    对于接口类型优先以单个单词命名。对于拥有唯一方法(method)或通过多个拥有唯一方法的接口组合而成的接口,Go语言的惯例是用“方法名+er”命名。
type Writer interface {    [good]
}

type Write interface {    [bad]
}
  • for循环标识声明
    存在上下文说明的地方,尽量简单明了,避免出现大段已知含义命名,避免冗余:
for i := 0, i < len(s); i++ {    [good]
    v := s[i]
    ...
}

for index := 0, index < len(s); index++ {    [bad]
    value := s[index]
    ...
}

2.变量声明

2.1.包级别变量

  • 包级别变量声明
    包级变量只能使用带有var关键字的变量声明形式,并推荐声明时将含义和作用相近的变量放在一个var块中,类型建议后移:
var (    [good]
    a = int32(1)
    f = float32(3.14)
)

var (    [bad]
    a int32 = 1
    f float32 = 3.14
)
  • 延迟声明
    对于声明时并不立即初始化的包级变量,可以直接声明:
var a int32
var f float32
  • 使用就近原则
    不是所有的包级变量都一定需要放置在文件头中,可以在第一次使用的函数上方放置:
var ErrNoUserInfo = errors.New("用户信息不存在")

func GetUserInfo(name string) (*User, error) {
    ...
    return nil, ErrNoUserInfo
}

2.2.函数级别变量

  • 函数级别变量声明
    通常对于延迟初始化的局部变量,可以使用var来进行前置声明:
func GetUserInfo(name string)(*User, error) {
    // 前置声明
    var user *User
    if user, err := getUserDB(name); err != nil {
        return nil, err
    }
    return user, nil
}
  • 对于声明且初始化的局部变量,采用短式声明:
[good]
taskType := int32(1)
s := []byte("hlelo")

[bad]
var taskType int32 = 1
var s []byte = []byte("hello")
  • 对于分支控制变量或for循环中变量,采用短式声明:
[good]
func Do(userName string) (*User, error){
    var u User
    if u, ok := userMap[userName]; !ok {
        return nil, ErrNoUser
    }
   for _, s := range u.Shops {
       handleShop(s)
       ...
   }
}

[bad]
func Do(userName string) (*User, error){
    var user User
    if user, existUser := userMap[userName]; !existUser {
        return nil, ErrNoUser
    }
   for _, userShop := range user.Shops {
       handleShop(userShop)
       ...
   }
}

3.常量声明

  • 常量声明与包级别变量声明类似,相同类型的常量可聚合在一个const块中,默认类型不指定(如a是int类型),特殊类型后置指定(f是float64类型)
const (    [good]
    a = 1
    f = float64(3.14)
)

const (    [bad]
    a int32 = 1
    f float64 = 3.14
)
  • 对于存在递增声明的常量,可以采用iota语法糖简化,避免手写冗余的递增值
[good]
const (
    _ = iota // 0
    A
    B
    C
)

[bad]
const (
    A = 1
    B = 2
    C = 3
)

4.零值可用

  • 切片append零值可用
var list []int // 该切片声明为零值
list = append(list, 1) // 依然生效,会自动初始化list
  • mutex零值可用
var mu sync.Mutex // 该mutex声明为零值
mu.Lock()
mu.Unlock()
  • 结构体零值可用
type Person struct {
   Name string
   Age int
   Child *Person
}

func main() {
   var p Person // 声明结构体后,自动为其内部各字段赋零值
   p.Age = 1
   p.Name = "test"
   p.Child = &Person{}
}
  • 零值指针调用方法可用
func (p *Person) GetPersonName() string {
   if p == nil {
      return "<nil>"
   }
   return p.Name
}

func main() {
   var p *Person             // 声明零值指针
   name := p.GetPersonName() // 零值指针调用方法
   fmt.Println(name)         // 输出<nil>,表明零值指针调用方法可行
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业论文java毕业设计选题源代码

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《【论文】S2SH药膳馆会员管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 &#xff0c;项目含有源码、论…

十四、使用 Vue Router 开发单页应用(2)

本章概要 动态路由匹配 查询参数 路由匹配语法 参数的自定义正则表达式可重复参数可选参数 嵌套路由 14.2 动态路由匹配 实际项目开发时&#xff0c;经常需要把匹配某种模式的路由映射到同一个组件。例如&#xff0c;有一个 Book 组件&#xff0c;对于所有 ID 各不相同的图书…

MOOC 大数据Note

MOOC 大数据NoteSparkSpark 一个软件栈满足不同交互场景Lineage 血缘关系创建 转换 动作ShuffleMapStageSpark的部署和应用方式RDD操作分为转换&#xff08;Transformation&#xff09;和动作&#xff08;Action&#xff09;两种类型&#xff0c;下列属于动作&#xff08;Actio…

开发工具——gcc/g++

开发工具gcc/g 完成代码的编写完后&#xff0c;要形成可执行程序&#xff0c;需要编译工具进行对代码的编译。 C语言的编译工具是gcc&#xff0c;c的编译工具是g。 如果g没有的话&#xff0c;可以切换到root执行命令yum install -y gcc-c C语言和C的编译&#xff1a; gc…

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我&#xff0c;温暖你」这部剧非常火&#xff0c;讲述的是程序员的爱情故事。 其中陈飞宇饰演的男主李峋&#xff0c;在剧中用程序做出的爱心跳动效果&#xff0c;非常炫。 网上各个大佬也是纷纷给出看法&#xff0c;综合就是不太可能用C语言来实现的。 大概率是AE…

Reg注册表读写

在Windows 95及其后继版本中&#xff0c;采用了一种叫做“注册表”的数据库来统一进行管理&#xff0c;将各种信息资源集中起来并存储各种配置信息。按照这一原则&#xff0c;Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表&#xff0c;用来管理…

Java内存溢出故障案例及Linux内存机制探究

文章目录Java内存溢出故障案例及Linux内存机制探究OOM Killer触发机制分析如何避免系统触发OOM Killer这部分内容属于demo案例分享&#xff0c;解决线上运维问题&#xff0c;思路是最重要的 Java内存溢出故障案例及Linux内存机制探究 这是一个线上数据分析应用故障案例&#…

Java—反射

文章目录什么是反射反射定义java创建对象的三个阶段反射过程反射第一步&#xff1a;获取类对象获取类对象的三种方式反射第二步&#xff1a;获取类信息如何获取类信息&#xff1f;1、获取成员变量&#xff1a;2、获取方法&#xff1a;3、获取构造器反射第三步&#xff1a;使用反…

vue学习笔记——简单入门总结(四)

文章目录1.Vue3的特性和变化1.1.创建vue3项目1.2.分析main.js变化&#xff1a;1.3.setup--组合式api的开端1.4.ref函数和reactive函数&#xff1a;1.5.watch监视属性1.5.watchEffect函数1.6.vue3生命周期&#xff1a;1.Vue3的特性和变化 1.1.创建vue3项目 1.这里我们使用脚手架…

RegAD-Registration based Few-Shot Anomaly Detection论文学习

摘要 本文为少样本异常检测&#xff08;FSAD&#xff09;&#xff0c;这是一种实用但尚未被研究的异常检测&#xff08;AD&#xff09;&#xff0c;少样本意味着在训练中只为每个类别提供有限数量的正常图像。 现有的少样本异常检测的研究主要使用的是 一类别一模型 学习范式…

李宏毅《DLHLP》学习笔记7 - Voice Conversion

视频链接&#xff1a;https://www.youtube.com/watch?vJj6blc8UijY&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index9&ab_channelHung-yiLee 课件链接&#xff1a;https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/Voice%20Conversion%20(v3).pdf 1. 语音转…

JAVA+MySQL 图书馆借阅信息管理系统

图书馆是当下很多大学生和有志青年学习和借阅图书的场所,图书馆每天都有大量的人员需要接待,如何能够更好的对用户的这些借阅信息进行信息化的管理是当下大多数图书馆管理人员所关心的问题 本系统是通过JAVA和MYSQL来进行开发的,通过本系统可以对图书馆内的图书信息,用户信息以…

基于PCIe的NVMe协议在FPGA中实现方法

NVMe协议是工作在PCIE的最上层协议层的&#xff0c;故需要先搞清楚PCIE。本文基于Xilinx的UltraScale&#xff0c;开发工具为Vivado2021.2。学习中以spec为主&#xff0c;其它资料辅助参考(重点介绍学习方法及资料&#xff0c;有时间再加细节)。请勿转载&#xff01; 1 PCIe学…

基于PHP+MySQL青年志愿者服务管理系统的设计与实现

志愿者管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的人积极的参加到志愿者行列中来,不仅为需要的人提供了服务,而且锻炼了自己,志愿者是一个对社会和自己以及需要帮助的人都有很多好处的事情 PHP青年志愿者服务网站是一个公益类型的网站,系统通过PHp&#xff1a;…

HK1 BOX刷入 Armbian系统作为服务器

HK1 BOX刷入 Armbian系统作为服务器 1 安装Armbian到EMMC 硬件 HK1 BOX s905 x3 固件版本选择 Armbian_23.02.0_Aml_s905x3_bullseye_5.15.80_server_2022.12.01用usb启动&#xff0c;tf/sd有的设备不行&#xff0c;有干扰&#xff0c;有可能从TF卡无法启动系统。 用usb启…

Grid 布局实现九宫格图片动画

前言 &#x1f44f;Grid 布局实现九宫格&#xff0c;background-position设置背景图像起始位置&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义css变量&#xff1a;九宫格中每个宫格的长/宽为w&#xff0c…

Kafka - 14 Kafka消费者 | 分区的分配策略及再平衡 | Range | RoundRobin | Sticky | CooperativeSticky

文章目录1. 分区的分配以及再平衡2. Range 分区分配以及再平衡3. RoundRobin 分区分配以及再平衡4. Sticky 分区分配以及再平衡1. 分区的分配以及再平衡 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多个partition组成&#xff0c;现在的问题是&#xff0…

【Python自然语言处理】规则分词中正向、反向、双向最大匹配法的讲解及实战(超详细 附源码)

需要源码和字典集请点赞关注收藏后评论区留言私信~~~ 一、规则分词 规则分词核心内容是建立人工专家词典库&#xff0c;通过将语句切分出的单词串与专家词典库中的所有词语进行逐一匹配&#xff0c;匹配成功则进行对象词语切分&#xff0c;否则通过增加或者减少一个字继续比较…

文件或者文件夹的忽略

文件或者文件夹的忽略 编辑项目的时候&#xff0c;将一些临时文件或者插件可以忽略上传到项目库中去。 追踪中的文件&#xff0c;不能被忽略。 首先的创建.gitignore文件&#xff0c;并且该文件需要放到项目的根目录下 接着&#xff0c;打开.gitignore文件 windows中 open d…

软件测试——分类

测试分类 一、按照测试对象划分 1、界面 界面测试UI测试 &#xff08;1&#xff09;测试软件界面元素完整性&#xff0c;正确性&#xff0c;一致性 &#xff08;2&#xff09;软件界面排版布局合理、字体、颜色 &#xff08;3&#xff09;测试界面的自适应性&#xff0c;界面…