最近几年Go语言非常火,也有不少公司使用Go来开发运维平台,比如小编之前写的一篇文章:开发一套云上数据库巡检系统。
这一篇文章,就来讲一下从0入门Go语言。
1 Go语言的开发环境准备
访问:
https://go.dev/dl/

点击上面箭头所指的链接下载Go安装包,再双击下载之后的安装包就可以安装。
执行Windows + R ,进入CMD,执行go,看是否有命令帮忙。
再安装Go编译器GoLand
进入到:
https://www.jetbrains.com/go/

点击Download下载安装包,再双击下载之后的安装包进入安装步骤。
安装好Goland之后,再打开。
点击新建项目:

会进入下图的配置:

Location,就是项目的路径;
GOROOT,就是我们安装Go的路径;
Environment,可以增加国内代理:
GOPROXY=https://goproxy.cn
进到项目里面之后,先新建一个文件夹main,再新建一个文件hello.go,效果如下:

这样,我们的一个Go的开发环境就准备好了。
2 编写简单的Go程序
package mainimport "fmt"func main() {fmt.Println("Hello, MySQL!")}
这里解释一下上面代码里的含义:
package main 把这个文件归属到main包,每个文件最开始都要指定这个文件所属的包; import "fmt"表示引入fmt这个包,应用这个包之后,就可以调用这个包里的函数; func 后面接函数,main是函数名,这里的main代表的是主函数,如果执行程序,就是执行的main这个函数。 再通过fmt里的函数Println输出后面的字符串。
运行方式,点击这个文件,再右键,点击 Run xxx,如下图:

3 Go赋值
隐式类型定义
比如:
var intA=10var charA = "a"
编译器可以根据变量的值来推断类型。
显式类型定义
var charB string = "b"
也就是变量定义时,写出变量类型。
除了使用上面这种形式进行赋值,还可以使用
intB := 20
如果是多个同类型的赋值,可以使用:
var intC, intD = 30,40
可以通过下面这段代码来测试Go赋值:
package mainimport "fmt"func main() {var intA = 10var charA = "a"var charB string = "b"intB := 20var intC, intD = 30,40fmt.Printf("intA=%v,intB=%v,intC=%v,intD=%v,charA=%v",intA,intB,intC,intD,charA,charB)}
4 Go输出
我们先来看下fmt.Print:属于标准输出流
比如
fmt.Print("aaa")
但是Print不能换行
再来看下fmt.Printf
跟Print不同的是,它可以格式化输出
我们可以来试一下:
charA := "MongoDB"fmt.Printf("hello,%s",charA)
这里的%s 来占位,后面的变量就能替换前面%s的占位符
但是Printf也不会换行。
如果需要换行,可以使用Println
比如:
fmt.Println("aaa")fmt.Println("bbb")
5 数组和切片
数组和切片,都可以看成存储数据的容器
数组是固定长度的容器,用来存放相同类型的多个元素。
比如声明一个包含5个整数的数组,可以用:
var numbers [5]int
在声明数组的时候写入数据,可以使用:
level := [3]string{"a","b","c"}
切片跟数组类似,但是切片是动态长度的
比如定义一个切片,可以用:
var names []string
定义一个有元素的切片,可以执行:
num := []int{1, 2, 3, 4, 5}
切片的部分引用:
slice := num[1:3]
包含了索引为1和2的元素(第一个元素的索引是0),值是[2, 3]。
使用append()向切片添加新元素:
numbers = append(num, 6)
6 结构体struct
结构体是一种复合数据类型,可以把不同的数据类型组合在一起,比如:
type stuInfo struct {name stringage int}
可以先创建结构体,再到后面的代码中使用,比如:
type Person struct {name stringage int}func main() {// 创建一个Person类型的变量p := Person{name: "Alice",age: 30,}// 访问和修改结构体的字段fmt.Println(p.name) // Alicep.age = 31fmt.Println(p.age) // 31}
大家可以试下上面代码运行的效果。
7 集合map
一种键值对的集合
可以通过这种方式声明一个map
ages := make(map[string]int)
在声明的同时初始化map并添加初始键值对:
ages := map[string]int{"John": 20,"Alice": 22,"Bob": 19,}
要向map中添加新的键值对,你可以使用以下语法:
ages["Emily"] = 21
通过指定键,你可以访问map中对应的值:
fmt.Println(ages["John"]) // 输出:20
8 Go条件判断
package mainimport ("fmt")func main() {score := 85if score >= 90 && score <= 100 {return "A"} else if score >= 80 && score < 90 {return "B"} else if score >= 70 && score < 80 {return "C"} else if score >= 60 && score < 70 {return "D"} else if score >= 0 && score < 60 {return "F"} else {return "无效的分数"}fmt.Printf("得分:%d,等级:%s\n", score, grade)}
这里注意语法就行,逻辑跟其他语言差不多。
9 Go循环
先来举一个例子:
for i := 1; i <= 5; i++ {fmt.Println(i)}
其中:
for 初始语句; 条件表达式; 后续语句 {// 循环体代码}
另外还有一种形式,比如:
fruits := []string{"apple", "banana", "orange"}for _, fruit := range fruits {fmt.Println(fruit)}
其中:
for 索引, 值 := range 可迭代对象 {// 循环体代码}
10 Go函数
我们先来创建一个用来倒计时的测试函数
func countDown(timeDuration int) (endOutput string) {for i := timeDuration;i>=0;{fmt.Println(i)time.Sleep(1 * time.Second)i--}endOutput = "倒计时完成"return}
其中:
countDown 是函数名;
timeDuration 是函数的输入变量,int表示这个输入变量的类型;
endOutput 是函数的输出变量,同样,string 表示输出的类型。
比如我们要使用这个函数,如下就是完整的代码:
package mainimport ("fmt""time")func main() {a := countDown(10) // 调用倒计时函数fmt.Println(a) // 输出函数的返回}func countDown(timeDuration int) (endOutput string) {for i := timeDuration;i>=0;{fmt.Println(i)time.Sleep(1 * time.Second)i--}endOutput = "倒计时完成"return}
好的,关于Go的基础入门知识点,就讲到这里;
学了这些,再借助AI,就可以完成一些简单的项目了。
当然,具体怎么通过Go完成DBA的一些项目,这些在DBA体系课(点击跳转查看详情)里也有详细讲解,比如课程中类似下面这些项目,都是用Golang开发的,并且包括详细开发过程:
云数据库(MySQL)慢查询系统开发;
云上数据库巡检系统开发(调用API);
DB自动化平台开发;
监控系统中开发发送企业微信告警的webhook;
自建数据库巡检系统开发;
数据库高可用测试程序;
等等。





