Golang开发变量声明命名惯例

news2024/9/22 13:41:49

在这里插入图片描述

《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/59920.html

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

相关文章

08_openstack之nova节点扩容

目录 一、环境准备 二、扩容节点配置 三、部署扩容节点 1、编辑answer.ini文件 2、执行安装 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 上述环境只部署了nova1节点&#xff0c;现将未部署的nova2节点作为扩…

1. Nginx 基本功能配置

Nginx 目录信息 图 为 windows 版本的。 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp 其中这几个文件夹在刚安装后是没有的&#xff0c;主要用来存放运行过程中的临时文件 client_body_t…

20221104英语学习

今日单词&#xff1a; portable adj.轻便的&#xff0c;便携的&#xff1b;手提式的 beautiful adj.美丽的, 风和日丽的, 出色的 hunter n.猎人, 狩猎者, &#xff08;猎食其他动物的&#xff09;猎兽, 搜集某种东西的人 circle n.圆, 圈, 圆形, 圆圈 style n.样式, 风格,…

Unity 算法 之 点集中计算绘制 凸包 的简单整理

Unity 算法 之 点集中计算绘制 凸包 的简单整理 目录 Unity 算法 之 点集中计算绘制 凸包 的简单整理 一、简单介绍 二、Graham扫描法 第一种说明&#xff1a; 第二种说明&#xff1a; 三、代码&#xff08;第二种说明&#xff09; 四、参考文献 一、简单介绍 算法&…

工作上的三个境界:能做,能做好,能持续做好

某天&#xff0c;技术岗A员工抬杠管理岗B员工的工作&#xff1a;你的工作啊&#xff0c;实习生都能做&#xff0c;你的价值太小了........一顿DISS。 这样的场景&#xff0c;似曾相识否&#xff1f;这是职场中常见的一类人“杠精”的表现。 做技术的&#xff0c;往往认为管理…

MySQL8.0 OCP最新版1Z0-908认证考试题库整理-006

原题 Choose the best answer.You are having performance issues with MySQL instances. Those servers are monitored withMySQL Enterprise Monitor.Using Query Analyzer, where do you begin to look for problem queries?A) Sort the "Exec" column and check…

什么是物联网?如何保护物联网iot安全性

物联网iot:物联网&#xff08;IoT&#xff09;将生活中事物以网络进行连接&#xff0c;彼此交换信息。整个世界借由设备连接成一体。 对于消费者而言&#xff0c;这意味着您可以在大洋彼岸远程调节家中的恒温器。但是对企业而言&#xff0c;物联网不仅创造了连接客户和合作伙伴…

BBR 公平收敛

BBR 的公平收敛来自于两点&#xff1a; ProbeBW 状态加速比收敛&#xff1a;带宽越大&#xff0c;加速比越小。ProbeRTT 状态 RTT 收敛&#xff1a;inflight 越大&#xff0c;越容易让 inflight 小的测到 minrtt 而避免进入 ProbeRTT&#xff0c;inflight 越小&#xff0c;测量…

用Python代码自己写Python代码,竟如此简单

用Python代码自己写Python代码&#xff0c;竟如此简单 Python作为一门功能强大且使用灵活的编程语言&#xff0c;可以应用于各种领域&#xff0c;具有“无所不能”的特质。 Python甚至可以代替人&#xff0c;自己写Python代码。而且很简单&#xff0c;只需学会Python的基础知…

RabbitMQ学习笔记

目录 尚硅谷mq视频学习笔记 1.1. MQ 的相关概念 1.1.1. 什么是MQ 1.1.2. 为什么要用MQ 1.1.3. MQ 的分类 1.ActiveMQ 2.Kafka 3.RocketMQ 4.RabbitMQ 1.1.4. MQ 的选择 1.Kafka 2.RocketMQ 3.RabbitMQ 1.2. RabbitMQ 1.2.1. RabbitMQ 的概念 1.2.2. 四大核心概念…

7.7网络(二)

接上篇&#xff1a;7.7 网络&#xff08;一&#xff09;_龙赤子的博客-CSDN博客 目录 三 操作系统涉及的网络内容 1 网络栈 2 协议 3 应用 三 操作系统涉及的网络内容 1 网络栈 这里我们重点讨论操作系统里面的网络。这部分在整个网络架构中&#xff0c;属于端的技术。对于端来…

分布式锁-全面详解(学习总结---从入门到深化)

目录 分布式锁概述 为什么需要分布式锁 什么是分布式锁 分布式锁的特点 分布式锁问题_业务介绍 案列介绍 技术选型 创建表 创建订单表 创建商品表 创建订单商品关联表 分布式锁问题_创建SpringBoot项目 引入依赖 修改配置文件 编写主启动类 代码生成 编写创建订单接…

(附源码)node.js电商管理系统 毕业设计 251001

node.js电商管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;电商管理系统当然也不能排除在外。电商管理系统 是以实际运用为开发背景&#xff0c;运用软件工程开…

【数据结构与算法】拓扑排序与关键路径

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;数据结构与算法 &#x1f320; 首发时间&#xff1a;2022年12月4日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e;…

【C++智能指针】智能指针的发展和循环引用的原理和解决

目录 1.RAIl&#xff08;智能指针的雏形&#xff09; 2.拷贝导致的问题以及智能指针发展历史 2.1拷贝的问题&#xff08;资源被析构两次&#xff09; 2.2auto_ptr(资源权转移&#xff0c;不建议使用) 2.3unique_ptr(防拷贝&#xff0c;在不需要拷贝的情况下使用) 2.4share…

【vue】vue-count-to(数字滚动)插件:

文章目录一、效果&#xff1a;二、使用&#xff1a;【1】安装插件【2】案例三、Options四、Functions一、效果&#xff1a; 二、使用&#xff1a; 官方文档&#xff1a; github地址——https://github.com/PanJiaChen/vue-countTo npm地址——https://www.npmjs.com/package/…

在本地PC运行 Stable Diffusion 2.0

Stable Diffusion 2.0在前几天已经发布了&#xff0c;新版本在上一个版本的基础上进行了许多改进。OpenCLIP中新的深度检测和更好的文本到图像模型是主要的改进之一。 有很多的文章介绍了Stable Diffusion 2.0的改进&#xff0c;所以我们就不多介绍了&#xff0c;这里我们将介…

30分钟部署一个kubernetes集群【1.17】

作者:李振良 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口 >1. 安装要求…

.m3u8.sqlite文件转mp4,m3u8.sqlite文件转视频工具(开源免费)

文章目录一、预先准备1. 前提2. 主要思路3. 准备工具二、视频转换实战2.1. 软件下载2.2. TS转MP4工具2.3. 操作流程一、预先准备 1. 前提 如果已经买了课程&#xff0c;是可以下载的&#xff0c;并且腾讯课堂APP里就有下载功能。 2. 主要思路 在APP上下载视频缓存到手机本地…

postgres源码解析41 btree索引文件的创建--1

上述小节讲解了索引文件的物理创建&#xff0c;本篇讲解btree索引元组填充至索引文件的操作。先从数据结构入手&#xff0c;后深入执行流程。 postgres源码解析37 表创建执行全流程梳理–1 postgres源码解析37 表创建执行全流程梳理–2 postgres源码解析37 表创建执行全流程梳理…