本篇文章只针对本地电脑环境的配置入门学习,如果是涉及到工作开发环境的配置,请移步至更详细的官方文档哦:[Golang] 开发环境配置

1. Go path/go Modules 开发模式对比

注意:

能使用 go modules 模式就使用该模式,即使以前没有使用该模式也可以设置成该模式。

传统 gopath 模式 - 不做包管理

在早期 go 版本中,创建项目是需要创建到 go/src 目录之下,否则无法 import。我们打开 GoLand 然后创建新的 project 时就可以看到 Go (GOPATH) 这个选项,它就是符合旧的 go 版本,默认创建到 go/src 之下。

另外,旧版本下还需要设置 GO111MODULE=off,不然运行时会报错。

该模式下,import 查找文件时会先查找 gopath/src 这个目录下的文件,其次再到 goroot/src 目录下查找。

gomodules 模式 - 会做包管理

注意,这个模式下就需要设置 GO111MODULE=on。

如果创建 project 时,我们选择了第一个 Go 这个选项。

那么创建出的项目就会多一个 go.mod 文件。

2. 下载 Golang

https://golang.google.cn/

到官网将 Golang sdk 下载下来,然后打开安装包,选择好安装路径,直接安装即可。

3. 配置 Golang 环境

https://goproxy.io/

GOROOT 就是 Go 软件的位置,GOPATH 就是我们自己写 go 代码的位置,GOBIN 一般就是指 GOPATH 下创建的 bin 目录。

3.1 Windows

  1. 第一步

找到电脑属性配置界面,直接打开文件夹,左边栏中右键 “ 此电脑 “ 并点击 “ 属性 “ 即可。

  1. 第二步

找到 “ 高级系统设置 “,点击 “ 环境变量 “。

  1. 第三步

将安装后的目录 \go\bin 添加到 “ 环境变量 “ 里的 “ 系统变量 “ 中的 “Path” 变量中。

同时,添加 GOROOT 变量。

另外,也可以设置自己存放 go 文件的文件夹作为 GOPATH 路径,但是高版本已经不用 go path 来管理项目了,而是用 go mod 依赖来管理。

  1. 第四步

配置国内镜像加速。

3.2 MacOS

  1. 第一步

配置国内镜像加速。

1
2
go env -w GO111MODULE=on 
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
  1. 第二步

创建项目代码的文件夹。

1
2
3
# project目录下有php、go、java、c、python文件夹,分别用于存放各语言的项目
sudo mkdir -p /Users/project/go
sudo chmod -R 777 /Users/project
  1. 第三步

配置 GOROOT、GOPATH、GOBIN。

可以通过 go env 查看当前 go 的相关设置,通过 go env -w 来设置 go 的相关环境变量,这里我们用文件去控制:

1
vim ~/.bash_profile

添加下面内容:

1
2
3
4
5
6
# go语言相关配置
export GOROOT=/usr/local/go
export GOPATH=/Users/project/go
export GOBIN=$GOPATH/bin
export GOPROXY=https://goproxy.cn,direct
export PATH=.:$PATH:$GOBIN

加载刚刚修改的配置:

1
source ~/.bash_profile

注:如果执行 source ~/.bash_profile 命令式报错:”no such file or directory: /Users/haveyb/.profile”,通过 touch 命令创建一个即可。

1
touch /Users/haveyb/.profile

然后重新执行 source ~/.bash_profile

执行完后,可以通过执行 go env 命令查看是否设置成功。

4. 安装并配置 Git 环境

https://git-scm.com/downloads

下载完安装包后打开,全部点击下一步即可。

注意,记住自己将 git 安装到哪个路径了。

然后将 git 目录下的 bin 路径,添加到 “ 环境变量 “ 中,同样是 “ 系统变量 “ 里的 “Path” 中。

5. 安装 Vscode 并配置环境

下载地址:https://code.visualstudio.com/

直接打开安装包,一直下一步即可。

5.1 下载 Vscode 插件

  • 安装 go 插件
  • 安装 coderunner
    • 可以帮我们快速编译并运行,不用再 go build 等操作
  • 更新 go 插件,ctrl+shift+p,go: install + update tools

5.2 初始化并运行第一个 Hello World 文件

小 Tips

  1. 显示/隐藏边栏,ctrl+b
  2. 显示/隐藏信息栏或终端,ctrl+反引号

另外,每次运行程序前都需要先保存文件再运行。

在项目文件夹下,创建一个 main.go 文件,然后输入下面代码:

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello World")
}

此时会显示 package main 这行出现错误,我们需要 go mod init 一下。

可以发现源文件已经不会跳出报错信息:

go.mod 文件内容:

如果需要下载包:

  • go get xxx: go get -u github.com/gin-gonic/gin

5.3 调试 Go 程序

  1. 设置断点

  2. 启动调试

  3. 查看变量值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func Test() {
x := 1
y := 2
fmt.Printf("x: %v\n", x)
fmt.Printf("y: %v\n", y)
}

func main() {
a := 1
b := "hello"
c := true

fmt.Printf("a: %v\n", a)
fmt.Printf("b: %v\n", b)
fmt.Printf("c: %v\n", c)

Test()
}

注意:调试程序需要 go mod 初始化项目

5.4 Vscode 常用快捷键

  1. pkgm:main包+main主函数
  2. ff:fmt.Printf("", var)
  3. for:for i := 0; i < count; i++ {}
  4. forr:for _, v := range v {}
  5. fmain:func main() {}
  6. a.print!:fmt.Printf("a: %v\n", a)

5.5 使用 Vscode 工作区

  1. 添加工作区

    直接在 vscode 中选择一个文件夹,添加到工作区中。

    我们这里选择新创建一个 my_workspace 文件夹,然后添加到工作区中。

  2. 保存工作区

    接下来将这个工作区,保存到我们的 my_workspace 文件夹中。

    注意,要保存到 my_workspace 文件夹中。

    这样,这个文件夹中就多了一个文件,我们可以直接点击这个文件来打开 vscode,进入到我们的工作区中。

  3. 初始化项目

    现在我们就可以在这个工作区中创建多个项目,然后分别在这些项目中初始化,并且每个项目之间不会互相干扰。

    这样一来,就可以在一个窗口下处理多个项目,而不用反反复复打开项目文件进行编码。

6. 运行多个 Go 文件

如果想运行多个文件,比如现在有两个 go 文件,我需要在主函数中获取这两个文件中的函数并运行。

另外,我将这两个文件放在同一个文件夹下:

注意: 这两个文件所属 package 就是它们所属的文件夹名称,并且 main.go 需要在最外面这一层。

我在 main.go 函数调用这两个函数,需要先引入它们所属的包,然后再调用包里的函数。

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"fmt"
"testproject1/service"
)

func main() {
fmt.Println("Hello World")
service.TestOrder()
service.TestUser()
}

7. 编码规范

  1. 代码规范不是强制的,也就是你不遵循代码规范写出来的代码运行也是完全没有问题的
  2. 代码规范目的是方便团队形成一个统一的代码⻛格,提高代码的可读性,规范性和统一性。本规范将从命名规范,注释规范,代码⻛格和 Go 语言提供的常用的工具这几个方面做一个说明。
  3. 规范并不是唯一的,也就是说理论上每个公司都可以制定自己的规范,不过一般来说整体上规范差异不会很 大。

命名是代码规范中很重要的一部分,统一的命名规则有利于提高的代码的可读性,好的命名仅仅通过命名就可以获取到足够多的信息。

  1. 当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字⺟开头,如:Group 1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);
  2. 命名如果以小写字⺟开头,则对包外是不可⻅的,但是他们在整个包的内部是可⻅并且可用的(像面向对象语言中的 private )

包名 :package

保持 package 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。

1
2
3
package model
package main

文件名

尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。

结构体命名

  • 采用驼峰命名法,首字⺟根据访问控制大写或者小写
  • Struct 申明和初始化格式采用多行,例如下面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type User struct{

Username string

Email string

}

u := User{

Username: "bobby",

Email: "[bobby@imooc.com](mailto:bobby@imooc.com)",

}

接口命名

  • 命名规则基本和上面的结构体类型
  • 单个函数的结构名以 “er” 作为后缀,例如 Reader , Writer 。
1
2
3
4
5
type Reader interface {

Read(p []byte) (n int, err error)

}

变量命名

  • 和结构体类似,变量名称一般遵循驼峰法,首字⺟根据访问控制原则大写或者小写,但遇到特有名词时,需要遵循以下规则:
  • 如果变量为私有,且特有名词为首个单词,则使用小写,如 apiClient
  • 其它情况都应当使用该名词原有的写法,如 APIClient、repoID、UserID
  • 错误示例:UrlArray,应该写成 urlArray 或者 URLArray
  • 若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
1
2
3
4
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool

常量命名

常量均需使用全部大写字⺟组成,并使用下划线分词

如果是枚举类型的常量,需要先创建相应类型:

1
2
3
4
5
6
7
8
9
type Scheme string

const (

HTTP Scheme = "http"

HTTPS Scheme = "https"

)

Go 提供 C ⻛格的 /* */ 块注释和 C ++ ⻛格的 // 行注释。行注释是常态;块注释主要显示为包注释,但在表达式中很有用或禁用大量代码。

  • 单行注释是最常⻅的注释形式,你可以在任何地方使用以 // 开头的单行注释
  • 多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段

go 语言自带的 godoc 工具可以根据注释生成文档,生成可以自动生成对应的网站(golang.org 就是使用 godoc 工具直接生成的),注释的质量决定了生成的文档的质量。每个包都应该有一个包注释,在 package 子句之前有一个块注释。对于多文件包,包注释只需要存在于一个文件中,任何一个都可以。包评论应该介绍包,并提供与整个包相关的信息。它将首先出现在 godoc ⻚面上,并应设置下面的详细文档。

包注释

每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释。包如果有多个 go 文件,只需要出现在一个 go 文件中(一般是和包同名的文件)即可。包注释应该包含下面基本信息 (请严格按照这个顺序,简介,创建人,创建时间):

  • 包的基本简介(包名,简介)
  • 创建者,格式:创建人: rtx 名
  • 创建时间,格式:创建时间: yyyyMMdd

结构(接口)注释

每个自定义的结构体或者接口都应该有注释说明,该注释对结构进行简要介绍,放在结构体定义的前一行,格式为:结构体名,结构体说明。同时结构体内的每个成员变量都要有说明,该说明放在成员变量的后面(注意对⻬),实例如下:

1
2
3
4
5
6
7
type User struct{

Username string

Email string

}

函数(方法)注释

每个函数,或者方法(结构体或者接口下的函数称为方法)都应该有注释说明,函数的注释应该包括三个方面(严格按照此顺序撰写):

  • 简要说明,格式说明:以函数名开头,”,” 分隔说明部分
  • 参数列表:每行一个参数,参数名开头,”,” 分隔说明部分
  • 返回值:每行一个返回值
1
2
3
4

func NewAttrModel(ctx *common.Context) *AttrModel {

}

代码逻辑注释

对于一些关键位置的代码逻辑,或者局部较为复杂的逻辑,需要有相应的逻辑说明,方便其他开发者阅读该段代码,实例如下:

1
2
3
4
5
xxxxx

xxxxxxx

xxxxxxx

注释⻛格

统一使用中文注释,对于中英文字符之间严格使用空格分隔,这个不仅仅是中文和英文之间,英文和中文标点之间也都要使用空格分隔,例如:

上面 Redis 、 id 、 DB 和其他中文字符之间都是用了空格分隔。

  • 建议全部使用单行注释
  • 和代码的规范一样,单行注释不要过⻓,禁止超过 120 字符。

Import 在多行的情况下,goimports 会自动帮你格式化,但是我们这里还是规范一下 import 的一些规范,如果你在一个文件里面引入了一个 package,还是建议采用如下格式:

如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包:

1
2
3
4
5
6
7
8
9
10
11
12
13
import (

"encoding/json"
"strings"

"myproject/models"
"myproject/controller"
"myproject/utils"

"[github.com/astaxie/beego](http://github.com/astaxie/beego)"
"[github.com/go-sql-driver/mysql](http://github.com/go-sql-driver/mysql)"

)

有顺序的引入包,不同的类型采用空格分离,第一种实标准库,第二是项目包,第三是第三方包。在项目中不要使用相对路径引入包:

1
2
3
import "../net"

import "[github.com/repo/proj/src/net”](http://github.com/repo/proj/src/net%E2%80%9D)

但是如果是引入本项目中的其他包,最好使用相对路径。

  • 错误处理的原则就是不能丢弃任何有返回 err 的调用,不要使用 _ 丢弃,必须全部处理。接收到错误,要么返回 err,或者使用 log 记录下来
  • 尽早 return:一旦有错误发生,⻢上返回
  • 尽量不要使用 panic,除非你知道你在做什么
  • 错误描述如果是英文必须为小写,不需要标点结尾
1
2
3
4
5
6
7
8
9
10
11
if err != nil {

} else {

}

if err != nil {

return

}