Go语言进阶

1104 未经授权,禁止转载了解课程

Go语言进阶

第3课:Go语言进阶

1. 结构体、接口和方法
结构体是 Go 中用于定义复杂数据结构的工具,而接口则是定义行为的集合。方法是附加到结构体或接口上的函数。
代码示例:

package main
    import "fmt"

    // 定义结构体
    type Person struct {
        Name string
        Age  int
    }

    // 定义接口
    type Greeter interface {
        Greet()
    }

    // 为结构体定义方法
    func (p Person) Greet() {
        fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
    }

    func main() {
        person := Person{Name: "Alice", Age: 30}
        person.Greet() // 调用方法
    }


2. 并发编程:Goroutines和Channels
Go 语言的并发模型基于 Goroutines 和 Channels,允许以简洁高效的方式处理并发任务。
代码示例:

package main
    import (
        "fmt"
        "time"
    )

    // 使用 Goroutine
    func printNumbers(ch chan int) {
        for i := 1; i <= 5; i++ {
            ch <- i // 发送数据到 Channel
            time.Sleep(time.Second)
        }
        close(ch)
    }

    func main() {
        ch := make(chan int)
        go printNumbers(ch) // 启动 Goroutine

        for num := range ch {
            fmt.Println("Received:", num)
        }
    }


3. 错误处理和日志
正确处理错误和记录日志对于开发高质量的 Go 程序至关重要。
代码示例:

package main
    import (
        "errors"
        "fmt"
        "log"
    )

    // 错误处理
    func divide(a, b float64) (float64, error) {
        if b == 0.0 {
            return 0.0, errors.New("division by zero")
        }
        return a / b, nil
    }

    func main() {
        result, err := divide(10.0, 0.0)
        if err != nil {
            log.Printf("Error: %s\n", err)
        } else {
            fmt.Println("Result:", result)
        }
    }


通过本课程,你将掌握 Go 语言的进阶特性,包括面向对象的编程元素、并发编程的核心概念,以及高效的错误处理和日志记录技巧。

课程介绍
讨论{{interaction.discussNum ? '(' + interaction.discussNum + ')' : ''}}
适合人群
这个脚本适合学习 Go 语言和数据库管理的人,特别是对 MySQL 事务锁定感兴趣的数据库管理员、后端开发和编程爱好者。对于技术面试的准备者也很有帮助。
你将会学到
用go开发一个线上自动解除死锁的工具
课程简介

这个程序是用 Go 语言编写的,主要用于检测和解除 MySQL 数据库中的锁定事务。它定期查询数据库,检查是否存在因锁定而等待的事务,并尝试解除这些锁定。执行界面如下:

图片.png



以下是主要功能 和掌握的知识:

主要功能

  1. 配置解析和输入提示:通过命令行参数或用户输入,脚本接收数据库连接信息(如地址、端口、用户、密码)和执行间隔。

  2. 数据库连接:使用 MySQL 驱动连接到 MySQL 数据库。

  3. 定时任务:按照设定的时间间隔执行任务。

  4. 检查锁定的事务:查询 information_schema 表来找出当前正在等待和阻塞的事务。

  5. 解除锁定:通过发送 KILL QUERY 命令来尝试解除阻塞事务的锁定。

  6. 日志记录:记录操作过程中的关键信息和任何可能的错误。

  7. 交互式停止:等待用户输入以停止定时任务和脚本。

能够学到到知识

  1. Go语言基础:包引入、类型定义、函数等语言特性

  2. 数据库操作:sql包的使用,连接MySQL,执行查询和更新

  3. 命令行解析:flag包,获取命令行参数

  4. 定时任务:time包,Ticker实现定期执行

  5. MySQL锁机制:了解InnoDB行锁,从information_schema获取锁信息

  6. 事务操作:用KILL QUERY语句终止锁等待事务

  7. 错误处理:错误Wrapping

  8. 代码组织:合理的包和函数组织

总的来说,开发这个脚本的人需要具备 Go 语言编程和基本的数据库操作知识,特别是在 MySQL 环境下的知识。此外,对于命令行工具的开发经验也是必需的。


这个命令提供了两种主要的执行方法:命令行参数执行和交互式执行。下面详细解释这两种方法:

命令行参数执行

用户可以在启动脚本时通过命令行提供所有必要的配置参数。这种方法适用于熟悉命令行操作的用户,或者当您希望将脚本部署为自动化任务时。参数包括数据库地址、端口、用户名、密码和任务执行间隔。

命令行参数如下:

  • --address: 数据库地址(例如:"127.0.0.1")

  • --port: 数据库端口(例如:"3306")

  • --user: 数据库用户名

  • --password: 数据库密码

  • --interval: 执行间隔(例如:"30s", "1m", "3m", "5m")

示例命令行执行:

./mysqlkill --address "127.0.0.1" --port "3306" --user "root" --password "yourpassword" --interval "1m"

交互式执行

如果在启动脚本时没有通过命令行提供足够的参数,脚本将进入交互式模式。在这种模式下,程序会提示用户依次输入所需的配置信息,如数据库地址、端口、用户名、密码和执行间隔。这种方法对于不熟悉命令行或者偏好逐一输入配置信息的用户来说更友好。

交互式模式的执行不需要在命令行中预先输入任何参数,只需直接运行编译后的程序:

./mysqlkill

然后按照程序提示输入所需的配置信息。

这两种执行方法提供了灵活性,使得不同技能水平的用户都能方便地使用这个脚本。命令行参数执行适合自动化和高级用户,而交互式执行则为初级用户和那些偏好逐步指导的场景提供便利。


展开更多
发布
头像

{{ item.user.nick_name }} {{ EROLE_NAME[item.user.identity] }}

置顶笔记
讨论图
{{ item.create_time }}回复
  • 删除

    是否确认删除?

    确认
    取消
  • {{ item.is_top == 1 ? '取消置顶' : '置顶'}}

    已有置顶的讨论,是否替换已有的置顶?

    确认
    取消
{{ tag.text}}
头像
{{ subitem.user.nick_name }}{{ EROLE_NAME[subitem.user.identity] }}
{{ subitem.create_time }}回复
删除

是否确认删除?

确认
取消
发布
{{pageType === 'video' ? '讨论区抢占沙发,可获得双倍学分' :'讨论区空空如也,你来讲两句~'}}
发布
{{tips.text}}
{{ noteHeaderTitle }} 笔记{{ hasMyNote ? '我的笔记' : '记笔记' }}
{{ hasMyNote ? '我的笔记' : '记笔记' }}
优质笔记
更新于:{{ $dayjs.formate('YYYY-MM-DD HH:mm:ss', item.last_uptime*1000) }}
头像
{{ detail.username }}

公开笔记对他人可见,有机会被管理员评为“优质笔记”

{{ noteEditor.content.length }}/2000

公开笔记
保存
提问

讲师收到你的提问会尽快为你解答。若选择公开提问,可以获得更多学员的帮助。

记录时间点
记录提问时视频播放的时间点,便于后续查看
公开提问
提交