大家好,我是明哥。

由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。


本文原文:http://golang.iswbm.com

Github:http://github.com/iswbm/GolangCodingTime

每个语言都有自己特色的编码规范,学习该语言的命名规范,能让你写出来的代码更加易读,更加不容易出现一些低级错误。

本文根据个人编码习惯以及网络上的一些文章,整理了一些大家能用上的编码规范,可能是一些主流方案,但不代表官方,这一点先声明一下。

1. 文件命名

  1. 由于 Windows平台文件名不区分大小写,所以文件名应一律使用小写
  1. 不同单词之间用下划线分词,不要使用驼峰式命名
  1. 如果是测试文件,可以以 _test.go 结尾
  1. 文件若具有平台特性,应以 文件名_平台.go 命名,比如 utils_ windows.go,utils_linux.go,可用的平台有:windows, unix, posix, plan9, darwin, bsd, linux, freebsd, nacl, netbsd, openbsd, solaris, dragonfly, bsd, notbsd, android,stubs
  1. 一般情况下应用的主入口应为 main.go,或者以应用的全小写形式命名。比如MyBlog 的入口可以为 myblog.go

2. 常量命名

目前在网络上可以看到主要有两种风格的写法

  1. 第一种是驼峰命名法,比如 appVersion
  1. 第二种使用全大写且用下划线分词,比如 APP_VERSION

这两种风格,没有孰好孰弱,可自由选取,我个人更倾向于使用第二种,主要是能一眼与变量区分开来。

如果要定义多个变量,请使用 括号 来组织。

const (APP_VERSION = "0.1.0"CONF_PATH = "/etc/xx.conf"
)

3. 变量命名

和常量不同,变量的命名,开发者们的喜好就比较一致了,统一使用 驼峰命名法

  1. 在相对简单的环境(对象数量少、针对性强)中,可以将完整单词简写为单个字母,例如:user写为u
  1. 若该变量为 bool 类型,则名称应以 Has, Is, CanAllow 开头。例如:isExist ,hasConflict 。
  1. 其他一般情况下首单词全小写,其后各单词首字母大写。例如:numShips 和 startDate 。
  1. 若变量中有特有名词(以下列出),且变量为私有,则首单词还是使用全小写,如 apiClient
  1. 若变量中有特有名词(以下列出),但变量不是私有,那首单词就要变成全大写。例如:APIClientURLString

这里列举了一些常见的特有名词:

// A GonicMapper that contains a list of common initialisms taken from golang/lint
var LintGonicMapper = GonicMapper{"API":   true,"ASCII": true,"CPU":   true,"CSS":   true,"DNS":   true,"EOF":   true,"GUID":  true,"HTML":  true,"HTTP":  true,"HTTPS": true,"ID":    true,"IP":    true,"JSON":  true,"LHS":   true,"QPS":   true,"RAM":   true,"RHS":   true,"RPC":   true,"SLA":   true,"SMTP":  true,"SSH":   true,"TLS":   true,"TTL":   true,"UI":    true,"UID":   true,"UUID":  true,"URI":   true,"URL":   true,"UTF8":  true,"VM":    true,"XML":   true,"XSRF":  true,"XSS":   true,
}

4. 函数命名

  1. 函数名还是使用 驼峰命名法
  1. 但是有一点需要注意,在 Golang 中是用大小写来控制函数的可见性,因此当你需要在包外访问,请使用 大写字母开头
  1. 当你不需要在包外访问,请使用小写字母开头

另外,函数内部的参数的排列顺序也有几点原则

  1. 参数的重要程度越高,应排在越前面
  1. 简单的类型应优先复杂类型
  1. 尽可能将同种类型的参数放在相邻位置,则只需写一次类型

5. 接口命名

使用驼峰命名法,可以用 type alias 来定义大写开头的 type 给包外访问。

type helloWorld interface {func Hello();
}type SayHello helloWorld

当你的接口只有一个函数时,接口名通常会以 er 为后缀

type Reader interface {Read(p []byte) (n int, err error)
}

6. 注释规范

注释分为

6.1 包注释

  1. 位于 package 之前,如果一个包有多个文件,只需要在一个文件中编写即可
  1. 如果你想在每个文件中的头部加上注释,需要在版权注释和 Package前面加一个空行,否则版权注释会作为Package的注释。
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package net

  1. 如果是特别复杂的包,可单独创建 doc.go 文件说明

6.2 代码注释

用于解释代码逻辑,可以有两种写法

单行注释使用 // ,多行注释使用 /* comment */

// 单行注释/*
多
行
注
释
*/

另外,对于代码注释还有一些更加苛刻的要求,这个看个人了,摘自网络:

  • 所有导出对象都需要注释说明其用途;非导出对象根据情况进行注释。
  • 如果对象可数且无明确指定数量的情况下,一律使用单数形式和一般进行时描述;否则使用复数形式。
  • 包、函数、方法和类型的注释说明都是一个完整的句子。
  • 句子类型的注释首字母均需大写;短语类型的注释首字母需小写。
  • 注释的单行长度不能超过 80 个字符。
  • 类型的定义一般都以单数形式描述:
    // Request represents a request to run a command. type Request struct { ...
  • 如果为接口,则一般以以下形式描述:
    // FileInfo is the interface that describes a file and is returned by Stat and Lstat.
    type FileInfo interface { ...
  • 函数与方法的注释需以函数或方法的名称作为开头:
    // Post returns *BeegoHttpRequest with POST method.
  • 如果一句话不足以说明全部问题,则可换行继续进行更加细致的描述:
    // Copy copies file from source to target path.
    // It returns false and error when error occurs in underlying function calls.
  • 若函数或方法为判断类型(返回值主要为 bool 类型),则以 <name> returns true if 开头:
    // HasPrefix returns true if name has any string in given slice as prefix.
    func HasPrefix(name string, prefixes []string) bool { ...

6.3 特别注释

  • TODO:提醒维护人员此部分代码待完成
  • FIXME:提醒维护人员此处有BUG待修复
  • NOTE:维护人员要关注的一些问题说明

7. 包的导入

单行的包导入

import "fmt"

多个包导入,请使用 {} 来组织

import {"fmt""os"
}

另外根据包的来源,对排版还有一定的要求

  1. 标准库排最前面,第三方包次之、项目内的其它包和当前包的子包排最后,每种分类以一空行分隔。
  1. 尽量不要使用相对路径来导入包。
import ("fmt""html/template""net/http""os""github.com/codegangsta/cli""gopkg.in/macaron.v1""github.com/gogits/git""github.com/gogits/gfm""github.com/gogits/gogs/routers""github.com/gogits/gogs/routers/repo""github.com/gogits/gogs/routers/user"
)

8. 善用 gofmt

除了命名规范外,Go 还有很多格式上的规范,比如

  1. 使用 tab 进行缩进
  1. 一行最长不要超过 80 个字符

因此在格式上的问题,你大部分都可以放心交由 gofmt 帮你调整。关于 gofmt 的文章还在写,应该这两天就会更新。你可以过两天再来看看。

参考文章:

  • Go语言(Golang)编码规范

好了,今天的文章就到这里了。

若今天的分享对你有帮助,不如点个赞,支持一下?

go 变量大写_28. 一文了解Go语言中编码规范相关推荐

  1. dart语言中的常量与变量

    dart 语言中的 常量 与 变量 李俊才 的 CSDN 博客 CSDN 主页:https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 邮箱 ...

  2. 在c语言中 使用变量的要求,关于C语言中变量的探讨

    摘 要: 在所有的计算机高级语言中,都存在着变量这样一个重要的概念.变量是计算机高级语言程序的重要成分之一.与其他语言中的变量相比,C语言中的变量所包含的内容更为丰富,包括变量的定义.数据类型.变量数 ...

  3. js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)...

    js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量) 一.总结 1.html中属性规范是 ...

  4. java语言中的合法的变量名_合法的变量名

    展开全部 变量可以通过变量名访问.在指令式语言中,变量通常是可变的:但在纯函数式语言(如Haskell)中,变量可能是e68a8462616964757a686964616f3133343365666 ...

  5. go 变量大写_go语言如何将大写转小写,c语言字符串小写转大写

    go语言如何将大写转小写围棋怎么把大写字母变成小写字母,go语言中大写转换为小写的方法:首先,创建一个go样本文件:然后定义一个字符串类型的变量:然后使用ToLower函数将所有大写的变量字符转换成小 ...

  6. go 变量大写_go语言如何将大写转小写

    go语言将大写转小写的方法:首先创建一个go示例文件:然后定义一个字符串类型的变量:接着使用ToLower函数将大写的变量字符全部转成小写:最后使用print函数打印转换后的结果即可. 本文操作环境: ...

  7. Java-POI替换Word模板文档中的变量,生成Word文档

    第一步:在项目中导入POI的jar包,以及相关的jar包. 所需的jar包列表: 下载地址:http://download.csdn.net/download/qq_34908167/10046670 ...

  8. 此上下文中不允许函数定义。_深度好文 | 你知道Go中的 context 是怎么实现的吗?...

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 语言的 context 包短小精悍,非常适合新手学习.不论是它的源码还是实际使用,都值得投入时间去学习. 这篇文章依然想 ...

  9. 好程序员技术文档HTML5开发中的javascript闭包

    好程序员技术文档HTML5开发中的javascript闭包,事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格;更优雅,更简洁的表达出代码;在某些方面提升代码的执行效率,同时避免对命 ...

最新文章

  1. 微信小程序直播开启公测了,与平台直播有何不同?小程序直播如何搭建
  2. EntityFramework之领域驱动设计实践(十)(转)
  3. mysql--SQL编程(关于mysql中的日期,关于重叠) 学习笔记2.2
  4. Zabbix监控 之 OID动态索引
  5. 1.odoo13之跟着官网做项目/实例(创建模块、创建模型类、配置角色安全权限文件)
  6. php 扩展apc 参数优化
  7. Windows10 ISO下载
  8. Android App优化之ANR详解
  9. qt html导pdf 页眉,如何使用wkhtmltopdf unpatched qt在每个页面上添加页眉和页脚?
  10. django-命名空间与反向解析-模板反向解析-视图反向解析
  11. 人脸年龄编辑:无可奈何花落去,似曾相似春又来!
  12. eclipse部署web没部署成功的问题
  13. 鸿蒙 usb调试,usb调试助手
  14. 机械传动机构思维导图
  15. “新基建”投资背景下 安防企业如何把握发展机遇?
  16. 一瓶可乐有多重?实战梅特勒托利多PS60串口通信开发
  17. 软件测试—第五章白盒测试.逻辑覆盖法
  18. TrustZone技术简介
  19. 2022Java面试心得,35岁的程序员被裁
  20. php windows 信号,win10连接投影仪无信号怎么办

热门文章

  1. python保存图片到指定路径_使用Python将不同大小照片制作为GIF动画2
  2. this.$router.push如何刷新页面_小程序丨微信小程序如何实现页面下拉刷新
  3. Python读写json文件的简单实现
  4. 如何在报表中实现算法的可挂接需求
  5. UVa 297 四分树
  6. 2.6 子窗口赋值给父窗口并关闭子窗口 我的程序猿之路:第十六章
  7. 浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别
  8. HashMap 与 ConcurrentHashMap
  9. using(){},Close(),Dispose()的区别
  10. 复制GAC中的DLL