暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

一文入门Go语言

127

最近几年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;

                                                            自建数据库巡检系统开发;

                                                            数据库高可用测试程序;

                                                            等等。

                                                            文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                            评论