Go 语言简介
- 最大特色:执行性能和开发效率的平衡。
- 核心特性:
- 高效的并发编程
- 内存回收(gc)
- 编译速度快
- 函数多返回值
- 语言交互性
- 没有异常处理
Go 环境搭建(Mac)
1 | vim .bashs_profile |
1 | export GOROOT=/usr/local/go |
1 | source ~/.bash_profiles |
Go 命令及其执行原理
Go 的源码文件
Go 的命令
- go run:专门用来运行命令源码文件的命令。
- go build:用于编译我们指定的源码文件或代码包以及他们的依赖包。
- go install:用来编译并安装代码包或者源码文件。
- go get:用于从远程代码仓库(比如 Github)上下载并安装代码包。
Go 开发工具
IDE:Goland
⚠️ IDE 中这两个位置的配置是否正确
Goland 常用快捷键
1 | # 打开文件 |
编码规范
命名规范
包命名
保持 package 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。
1 | package demo |
文件命名
尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
1 | my_test.go |
结构体命名
- 采用驼峰命名法,首字母根据访问控制大写或者小写
- struct 申明和初始化格式采用多行,例如下面:
1 | // 多行申明 |
接口命名
- 命名规则基本和上面的结构体类型
- 单个函数的结构名以 “er” 作为后缀,例如 Reader , Writer 。
1 | type Reader interface { |
变量命名
- 和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写,但遇到特有名词时,需要遵循以下规则:
- 如果变量为私有,且特有名词为首个单词,则使用小写,如 apiClient
- 其它情况都应当使用该名词原有的写法,如 APIClient、repoID、UserID
- 错误示例:UrlArray,应该写成 urlArray 或者 URLArray
- 若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
1 | var isExist bool |
常量命名
常量均需使用全部大写字母组成,并使用下划线分词
1 | const APP_VER = "1.0" |
如果是枚举类型的常量,需要先创建相应类型:
1 | type Scheme string |
关键字
下面的列表显示了Go中的保留字。这些保留字不能用作常量或变量或任何其他标识符名称。
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
注释
包注释
每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释。包如果有多个 go 文件,只需要出现在一个 go 文件中(一般是和包同名的文件)即可。 包注释应该包含下面基本信息(请严格按照这个顺序,简介,创建人,创建时间):
- 包的基本简介(包名,简介)
- 创建者,格式: 创建人: rtx 名
- 创建时间,格式:创建时间: yyyy/MM/dd
例如 util 包的注释示例如下
1 | // util 包, 该包包含了项目共用的一些常量,封装了项目中一些共用函数。 |
结构(接口)注释
每个自定义的结构体或者接口都应该有注释说明,该注释对结构进行简要介绍,放在结构体定义的前一行,格式为: 结构体名, 结构体说明。同时结构体内的每个成员变量都要有说明,该说明放在成员变量的后面(注意对齐),实例如下:
1 | // User ,用户对象,定义了用户的基础信息 |
函数(方法)注释
每个函数,或者方法(结构体或者接口下的函数称为方法)都应该有注释说明,函数的注释应该包括三个方面(严格按照此顺序撰写):
- 简要说明,格式说明:以函数名开头,“,”分隔说明部分
- 参数列表:每行一个参数,参数名开头,“,”分隔说明部分
- 返回值: 每行一个返回值
示例如下:
1 | // NewtAttrModel , 属性数据层操作类的工厂方法 |
代码逻辑注释
对于一些关键位置的代码逻辑,或者局部较为复杂的逻辑,需要有相应的逻辑说明,方便其他开发者阅读该段代码,实例如下:
1 | // 从 Redis 中批量读取属性,对于没有读取到的 id , 记录到一个数组里面,准备从 DB 中读取 |
注释风格
统一使用中文注释,对于中英文字符之间严格使用空格分隔, 这个不仅仅是中文和英文之间,英文和中文标点之间也都要使用空格分隔,例如:
1 | // 从 Redis 中批量读取属性,对于没有读取到的 id , 记录到一个数组里面,准备从 DB 中读取 |
上面 Redis 、 id 、 DB 和其他中文字符之间都是用了空格分隔。
- 建议全部使用单行注释
- 和代码的规范一样,单行注释不要过长,禁止超过 120 字符。
代码风格
缩进和折行
- 缩进直接使用 gofmt 工具格式化即可(gofmt 是使用 tab 缩进的);
- 折行方面,一行最长不超过 120 个字符,超过的请使用换行展示,尽量保持格式优雅。
我们使用 Goland 开发工具,可以直接使用快捷键:ctrl + alt + L,即可。
语句的结尾
Go 语言中是不需要类似于 Java 需要冒号结尾,默认一行就是一条数据
如果你打算将多个语句写在同一行,它们则必须使用 ;
括号和空格
括号和空格方面,也可以直接使用 gofmt 工具格式化(go 会强制左大括号不换行,换行会报语法错误),所有的运算符和操作数之间要留空格。
1 | // 正确的方式 |
import 规范
import 在多行的情况下,goimports 会自动帮你格式化,但是我们这里还是规范一下 import 的一些规范,如果你在一个文件里面引入了一个 package,还是建议采用如下格式:
1 | import ( |
如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包:
1 | import ( |
有顺序的引入包,不同的类型采用空格分离,第一种实标准库,第二是项目包,第三是第三方包。
在项目中不要使用相对路径引入包:
1 | // 这是不好的导入 |
但是如果是引入本项目中的其他包,最好使用相对路径。
错误处理
- 错误处理的原则就是不能丢弃任何有返回 err 的调用,不要使用 _ 丢弃,必须全部处理。接收到错误,要么返回 err,或者使用 log 记录下来
- 尽早 return:一旦有错误发生,马上返回
- 尽量不要使用 panic,除非你知道你在做什么
- 错误描述如果是英文必须为小写,不需要标点结尾
- 采用独立的错误流进行处理
1 | // 错误写法 |
语法基础
基础知识
- 变量
- 常量
- iota 关键字
- 基本数据类型:布尔类型、数值类型、字符串
- 程序的流程结构:顺序结构、分支结构(if、switch)、循环结构(for、break、continue)
练习
1 | const ( |
1 | // 打印乘法表 |
1 | // 素数:只能被1和本身整除的数。 |
1 | // 生成随机数 |
1 | // 数组 |
复合数据类型
复合数据类型:array、slice、map、function、pointer、struct、interface、channel
函数、指针、接口、错误处理
学习资料