1. 环境搭建
1.1. Go开发包下载安装
Golang官方网站:https://golang.google.cn/learn/
下载 Windows 版本的Go语言开发包时选择 MSI 格式,它可以直接安装到系统,不需要额外的操作,无脑点“Next”即可完成安装。这里我安装到G盘下的Go目录,安装完成后,目录如下:
目录的结构遵守 GOPATH 规则,目录中各个文件夹的含义如下表所示:
Go 开发包的安装目录的功能及说明
| 目录名 | 说明 |
|---|---|
| api | 每个版本的 api 变更差异 |
| bin | go 源码包编译出的编译器(go)、文档工具(godoc)、格式化工具(gofmt) |
| doc | 英文版的 Go 文档 |
| lib | 引用的一些库文件 |
| misc | 杂项用途的文件,例如 Android 平台的编译、git 的提交钩子等 |
| pkg | Windows 平台编译好的中间文件 |
| src | 标准库的源码 |
| test | 测试用例 |
1.2. 配置环境变量
开发包安装完成后,我们还需要配置一下GOPATH 环境变量,才可以使用Go语言进行开发。GOPATH 是一个路径,用来存放开发中需要用到的代码包。
打开环境变量设置后,在用户变量里找到 GOPATH 对应的选项点击编辑之后就可以修改了,没有的话可以选择新建,并将变量名填写为 GOPATH,该变量值为Go工程路径(尽量选择空目录),这里我在G盘下新建了一个GoProject文件夹。

新建GOROOT : 设置为Go安装路径(G:\Go)
修改Path变量:添加G:\Go\bin;%GOPATH%\bin,需要把GOPATH中的可执行目录也配置到环境变量中,否则自行下载的第三方go工具就无法使用。
- 工程目录就是我们用来存放开发的源代码的地方,对应的也是Go里的GOPATH环境变量。这个环境变量指定之后,我们编译源代码等生成的文件都会放到这个目录下,GOPATH环境变量的配置参考上面的安装Go,配置到Windows下的系统变量里。
GOPATH之下主要包含三个目录:bin、pkg、src。bin目录主要存放可执行文件;pkg目录存放编译好的库文件,主要是*.a文件;src目录下主要存放Go的源文件。
1.3. Go语言工程目录详解
一般的编程语言对工程(项目)的目录结构是没有什么规定的,但是Go语言却在这方面做了相关规定,
Go语言开发环境时提到的环境变量 GOPATH,项目的构建主要是靠它来实现的。如果想要构建一个项目,就需要将这个项目的目录添加到 GOPATH 中,多个项目之间可以使用;分隔。如果不配置 GOPATH,即使处于同一目录,代码之间也无法通过绝对路径相互调用。
一个Go语言项目的目录一般包含以下三个子目录:src 目录:放置项目和库的源文件;
- pkg 目录:放置编译后生成的包/库的归档文件;
- bin 目录:放置编译后生成的可执行文件。
1.4. Go语言依赖管理
https://www.cnblogs.com/Dr-wei/p/11742253.html1.3. 检测是否安装成功
使用快捷键win+R,输入cmd打开命令行:
查看go版本:go version
查看go的配置信息:go env
输入命令后能正确显示相关信息即安装成功。1.4 安装IDE
目前Go开发中使用比较多的IDE有两款:GoLand和VS Code,GoLand由Jetbrains团队开发,功能强大,开箱即用,但是资源消耗较严重,存在卡顿问题;VS Code轻量小巧,安装一款插件后同样可以用于Go开发。一般在工作中使用GoLand开发较多,所以这里我选择使用GoLand进行Go的开发学习。
GoLand官网
Golang有哪些ide?2. HelloWorld程序
2.1. 项目创建和程序编写
- 使用GoLand新建一个Go项目


- 创建一个go文件


- 编写HelloWorld程序 ```go package main // 声明main包
import “fmt” // 导入fmt包,打印字符串时需要使用该包
func main() { fmt.Println(“HelloWorld!”) }
4. 执行Go程序<a name="Nd99V"></a>## 2.2. HelloWorld程序说明1. package(创建包)Go语言以“包”作为管理单位,每个 Go 源文件必须先声明它所属的包,所以我们会看到每个 Go 源文件的开头都是一个 package 声明,格式:`package name`。Go语言的包与文件夹是一一对应的,它具有以下几个特点:- 一个目录下的同级文件属于同一个包。- 包名可以与其目录名不同。- main 包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件。 main 函数,它是Go语言程序的入口函数,也即程序启动后运行的第一个函数。main 函数只能声明在 main 包中,不能声明在其他包中,并且,一个 main 包中也必须有且仅有一个 main 函数。2. import(导入包)在包声明之后,是 import 语句,用于导入程序中所依赖的包,导入的包名使用双引号""包围,格式如下:`import "name"`。`import "fmt"`告诉 Go 编译器这个程序需要使用 fmt 包中的函数或者变量等,fmt 包是Go语言标准库为我们提供的,用于格式化输入输出的内容(类似于C语言中的 stdio.h 头文件),类似的还有 os 包、io 包等。<br />注意:导入的包中不能含有代码中没有使用到的包,否则Go编译器会报编译错误,例如 `imported and not used: "xxx"`,`"xxx"` 表示包名。<br />也可以使用一个 import 关键字导入多个包,此时需要用括号( )将包的名字包围起来,并且每个包名占用一行:```goimport("name1""name2")
除了上述的导包方式,Go还提供了三种导包方式:
点操作
import(. "fmt")
点操作的含义就是在该包导入之后,当调用该包的函数时,可以省略前缀的包名,即
fmt.Println("HelloWorld!")可以省略的写成Println("HelloWorld!")。别名操作
import(f "fmt")
别名操作可以给包取别名,当调用包函数时使用包的别名进行调用,即
f.Println("HelloWorld!")。下划线_操作
import (_ "github.com/mattn/go-sqlite3")
_操作比较容易让人费解,在导入路径前加入下划线表示只执行该库的 init 函数而不对其它对象进行真正地导入,即仅让导入的包做初始化,而不使用包中其他功能。因为 Go 语言的数据库驱动都会在 init 函数中注册自己,所以我们只需要进行上述操作即可;否则的话,Go 语言的编译器会提示导入了包却没有使用的错误。

例如定义一个Foo struct,然后对它进行初始化:package fooimport "fmt"type Foo struct {Id intName string}func init() {f := &Foo{Id: 123, Name: "abc"}fmt.Printf("init foo object: %v\n", f)}
然后在main函数里面引入test/foo:
package mainimport ("fmt"_ "test/foo")func main() {fmt.Printfln("hello world")}
运行结果如下
init foo object: &{123 abc}hello world
可以看到,在main函数输出
hello world之前就已经对foo对象进行了初始化。
- 函数
在Go语言中,所有函数都以关键字 func 开头的,定义格式如下所示:
func 函数名 (参数列表) (返回值列表){函数体}
格式说明如下:
- 函数名:由字母、数字、下画线_组成,其中,函数名的第一个字母不能为数字,并且,在同一个包内,函数名称不能重名。
- 参数列表:一个参数由参数变量和参数类型组成,例如func foo( a int, b string )。
- 返回值列表:可以是返回值类型列表,也可以是参数列表那样变量名与类型的组合,函数有返回值时,必须在函数体中使用 return 语句返回。
- 函数体:能够被重复调用的代码片段。
注意:Go语言函数的左大括号{不能单独放在一行,必须和函数名称在同一行,否则会报错。Go的语句末尾不需要使用;来作为结束符,Go 编译器会自动帮我们添加,当然,加上;也是可以的。 ```go package main
import “fmt”
func main()
{ // 错误,{ 不能在单独的行上
fmt.Println(“Hello, World!”)
}
4. 打印输出Println 是 fmt 包中的一个函数,它用来格式化输出数据,比如字符串、整数、小数等,类似于C语言中的 printf 函数。点号.是Go语言运算符的一种,这里表示调用 fmt 包中的 Println 函数。<br />注:Println 函数打印完成后会自动换行,ln是 line 的缩写。<a name="FL6hx"></a>## 2.3. Go语言结构Go语言的基础组成有以下几个部分:- 包声明- 导入包- 函数- 变量- 语句 & 表达式- 注释```go// 常量定义const PI = 3.14// 全局变量的声明和赋值var name = "gopher"// 一般类型声明type newType int// 结构的声明type gopher struct{}// 接口的声明type golang interface{}// 由main函数作为程序入口点启动func main() {Println("Hello World!")}//前面加个点表示省略调用,那么调用该模块里面的函数,可以不用写模块名称了:import . "fmt"func main (){Println("hello,world")}// 单行注释/* 多行注释 */
通过 const 关键字来进行常量的定义。
通过在函数体外部使用 var 关键字来进行全局变量的声明和赋值。
通过 type 关键字来进行结构(struct)和接口(interface)的声明。
通过 func 关键字来进行函数的声明。
Go 语言中变量的声明必须使用空格隔开,如:var age int;
