最近几年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 main
import "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=10
var charA = "a"
编译器可以根据变量的值来推断类型。
显式类型定义
var charB string = "b"
也就是变量定义时,写出变量类型。
除了使用上面这种形式进行赋值,还可以使用
intB := 20
如果是多个同类型的赋值,可以使用:
var intC, intD = 30,40
可以通过下面这段代码来测试Go赋值:
package main
import "fmt"
func main() {
var intA = 10
var charA = "a"
var charB string = "b"
intB := 20
var intC, intD = 30,40
fmt.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 string
age int
}
可以先创建结构体,再到后面的代码中使用,比如:
type Person struct {
name string
age int
}
func main() {
// 创建一个Person类型的变量
p := Person{
name: "Alice",
age: 30,
}
// 访问和修改结构体的字段
fmt.Println(p.name) // Alice
p.age = 31
fmt.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 main
import (
"fmt"
)
func main() {
score := 85
if 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 main
import (
"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;
自建数据库巡检系统开发;
数据库高可用测试程序;
等等。