1. 环境搭建

1.1. Go开发包下载安装

Golang官方网站:https://golang.google.cn/learn/
image.png
下载 Windows 版本的Go语言开发包时选择 MSI 格式,它可以直接安装到系统,不需要额外的操作,无脑点“Next”即可完成安装。这里我安装到G盘下的Go目录,安装完成后,目录如下:
image.png
目录的结构遵守 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文件夹。
image.png
image.png
新建GOROOT : 设置为Go安装路径(G:\Go)
image.png
修改Path变量:添加G:\Go\bin;%GOPATH%\bin,需要把GOPATH中的可执行目录也配置到环境变量中,否则自行下载的第三方go工具就无法使用。
image.png

  • 工程目录就是我们用来存放开发的源代码的地方,对应的也是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.html

    1.3. 检测是否安装成功

    使用快捷键win+R,输入cmd打开命令行:
    查看go版本:go version
    查看go的配置信息:go env
    image.png
    输入命令后能正确显示相关信息即安装成功。

    1.4 安装IDE

    目前Go开发中使用比较多的IDE有两款:GoLand和VS Code,GoLand由Jetbrains团队开发,功能强大,开箱即用,但是资源消耗较严重,存在卡顿问题;VS Code轻量小巧,安装一款插件后同样可以用于Go开发。一般在工作中使用GoLand开发较多,所以这里我选择使用GoLand进行Go的开发学习。
    GoLand官网
    Golang有哪些ide?

    2. HelloWorld程序

    2.1. 项目创建和程序编写

  1. 使用GoLand新建一个Go项目

image.png
image.png

  1. 创建一个go文件

image.pngimage.png

  1. 编写HelloWorld程序 ```go package main // 声明main包

import “fmt” // 导入fmt包,打印字符串时需要使用该包

func main() { fmt.Println(“HelloWorld!”) }

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22161775/1648287299770-e89eb082-f26d-4108-a7b1-714bf8c820e2.png#clientId=ue4fe8c93-cf91-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=206&id=ub8e7ea4c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=206&originWidth=569&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14659&status=done&style=none&taskId=u67949a5a-496b-49c9-8b5d-85162859ba0&title=&width=569)
  2. 4. 执行Go程序
  3. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22161775/1648287360014-58d0d913-ee3f-497d-8643-bb03fba68f43.png#clientId=ue4fe8c93-cf91-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=195&id=u51199ab3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=195&originWidth=1037&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25570&status=done&style=none&taskId=ucfe4020c-2f72-423f-8552-09e8fb7cdfc&title=&width=1037)
  4. <a name="Nd99V"></a>
  5. ## 2.2. HelloWorld程序说明
  6. 1. package(创建包)
  7. Go语言以“包”作为管理单位,每个 Go 源文件必须先声明它所属的包,所以我们会看到每个 Go 源文件的开头都是一个 package 声明,格式:`package name`Go语言的包与文件夹是一一对应的,它具有以下几个特点:
  8. - 一个目录下的同级文件属于同一个包。
  9. - 包名可以与其目录名不同。
  10. - main 包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件。 main 函数,它是Go语言程序的入口函数,也即程序启动后运行的第一个函数。main 函数只能声明在 main 包中,不能声明在其他包中,并且,一个 main 包中也必须有且仅有一个 main 函数。
  11. 2. import(导入包)
  12. 在包声明之后,是 import 语句,用于导入程序中所依赖的包,导入的包名使用双引号""包围,格式如下:`import "name"``import "fmt"`告诉 Go 编译器这个程序需要使用 fmt 包中的函数或者变量等,fmt 包是Go语言标准库为我们提供的,用于格式化输入输出的内容(类似于C语言中的 stdio.h 头文件),类似的还有 os 包、io 包等。<br />注意:导入的包中不能含有代码中没有使用到的包,否则Go编译器会报编译错误,例如 `imported and not used: "xxx"``"xxx"` 表示包名。<br />也可以使用一个 import 关键字导入多个包,此时需要用括号( )将包的名字包围起来,并且每个包名占用一行:
  13. ```go
  14. import(
  15. "name1"
  16. "name2"
  17. )

除了上述的导包方式,Go还提供了三种导包方式:

  • 点操作

    1. import(
    2. . "fmt"
    3. )

    点操作的含义就是在该包导入之后,当调用该包的函数时,可以省略前缀的包名,即fmt.Println("HelloWorld!")可以省略的写成Println("HelloWorld!")

  • 别名操作

    1. import(
    2. f "fmt"
    3. )

    别名操作可以给包取别名,当调用包函数时使用包的别名进行调用,即f.Println("HelloWorld!")

  • 下划线_操作

    1. import (
    2. _ "github.com/mattn/go-sqlite3"
    3. )

    _操作比较容易让人费解,在导入路径前加入下划线表示只执行该库的 init 函数而不对其它对象进行真正地导入,即仅让导入的包做初始化,而不使用包中其他功能。因为 Go 语言的数据库驱动都会在 init 函数中注册自己,所以我们只需要进行上述操作即可;否则的话,Go 语言的编译器会提示导入了包却没有使用的错误。
    image.png
    例如定义一个Foo struct,然后对它进行初始化:

    1. package foo
    2. import "fmt"
    3. type Foo struct {
    4. Id int
    5. Name string
    6. }
    7. func init() {
    8. f := &Foo{Id: 123, Name: "abc"}
    9. fmt.Printf("init foo object: %v\n", f)
    10. }

    然后在main函数里面引入test/foo:

    1. package main
    2. import (
    3. "fmt"
    4. _ "test/foo"
    5. )
    6. func main() {
    7. fmt.Printfln("hello world")
    8. }

    运行结果如下

    1. init foo object: &{123 abc}
    2. hello world

    可以看到,在main函数输出hello world之前就已经对foo对象进行了初始化。

  1. 函数

在Go语言中,所有函数都以关键字 func 开头的,定义格式如下所示:

  1. func 函数名 (参数列表) (返回值列表){
  2. 函数体
  3. }

格式说明如下:

  • 函数名:由字母、数字、下画线_组成,其中,函数名的第一个字母不能为数字,并且,在同一个包内,函数名称不能重名。
  • 参数列表:一个参数由参数变量和参数类型组成,例如func foo( a int, b string )。
  • 返回值列表:可以是返回值类型列表,也可以是参数列表那样变量名与类型的组合,函数有返回值时,必须在函数体中使用 return 语句返回。
  • 函数体:能够被重复调用的代码片段。
    注意:Go语言函数的左大括号{不能单独放在一行,必须和函数名称在同一行,否则会报错。Go的语句末尾不需要使用;来作为结束符,Go 编译器会自动帮我们添加,当然,加上;也是可以的。 ```go package main

import “fmt”

func main()
{ // 错误,{ 不能在单独的行上 fmt.Println(“Hello, World!”) }

  1. 4. 打印输出
  2. Println fmt 包中的一个函数,它用来格式化输出数据,比如字符串、整数、小数等,类似于C语言中的 printf 函数。点号.是Go语言运算符的一种,这里表示调用 fmt 包中的 Println 函数。<br />注:Println 函数打印完成后会自动换行,ln line 的缩写。
  3. <a name="FL6hx"></a>
  4. ## 2.3. Go语言结构
  5. Go语言的基础组成有以下几个部分:
  6. - 包声明
  7. - 导入包
  8. - 函数
  9. - 变量
  10. - 语句 & 表达式
  11. - 注释
  12. ```go
  13. // 常量定义
  14. const PI = 3.14
  15. // 全局变量的声明和赋值
  16. var name = "gopher"
  17. // 一般类型声明
  18. type newType int
  19. // 结构的声明
  20. type gopher struct{}
  21. // 接口的声明
  22. type golang interface{}
  23. // 由main函数作为程序入口点启动
  24. func main() {
  25. Println("Hello World!")
  26. }
  27. //前面加个点表示省略调用,那么调用该模块里面的函数,可以不用写模块名称了:
  28. import . "fmt"
  29. func main (){
  30. Println("hello,world")
  31. }
  32. // 单行注释
  33. /* 多行注释 */

通过 const 关键字来进行常量的定义。
通过在函数体外部使用 var 关键字来进行全局变量的声明和赋值。
通过 type 关键字来进行结构(struct)和接口(interface)的声明。
通过 func 关键字来进行函数的声明。
Go 语言中变量的声明必须使用空格隔开,如:var age int;

3. Go包管理

手把手教你怎么导入Go语言第三方库