使用Go实现日常自动化:编写稳定运行的脚本

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Go是自动化的理想语言?

\n\n

您是否曾经编写过一个在笔记本电脑上运行良好,却因缺少正确解释器版本而在服务器上“崩溃”的Python脚本?或者,当逻辑变得比“复制文件”稍微复杂一点时,您的Bash脚本就变成了一个难以维护的庞然大物?

\n\n

如果是这样,那么您应该关注一下Go。这门语言诞生于Google内部,正是为了解决工程师在编写工具和服务时遇到的问题。它编译成一个独立的二进制文件(无需依赖!),运行速度极快,并且拥有简单而强大的语法。

\n\n

在本文中,我们不会教您语法基础。我们将直接切入正题:使用Go实现任务自动化,并附上真实的代码示例。您将学习如何编写您的第一个“Go脚本”,这些脚本将比它们的Python版本运行得更可靠、更快速。我们开始吧!

\n\n

1. 文件系统操作:像专家一样清理日志

\n\n

管理员或开发人员最常见的任务之一就是清理旧日志。让我们编写一个工具,删除指定目录中超过N天的文件。这是使用Go实现自动化的经典示例。

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n    "time"\n)\n\nfunc main() {\n    // 日志目录路径\n    logDir := "/var/log/myapp"\n    // 删除超过7天的文件\n    maxAge := 7 * 24 * time.Hour\n\n    err := filepath.Walk(logDir, func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n\n        // 跳过目录\n        if info.IsDir() {\n            return nil\n        }\n\n        // 检查文件年龄\n        if time.Since(info.ModTime()) > maxAge {\n            fmt.Printf("删除旧文件: %s (年龄: %v)\\n", path, time.Since(info.ModTime()))\n            err := os.Remove(path)\n            if err != nil {\n                fmt.Printf("删除 %s 时出错: %v\\n", path, err)\n            }\n        }\n        return nil\n    })\n\n    if err != nil {\n        fmt.Printf("遍历目录时出错: %v\\n", err)\n    }\n}\n
\n\n

这段代码是使用Go自动化任务的一个绝佳示例,无需额外的库。内置的filepath包可以递归遍历文件夹,而os.Remove则负责清理空间。编译一次后,您将获得一个可以在任何服务器上通过cron运行的二进制文件。

\n\n

2. HTTP请求与API解析

\n\n

假设您需要监控多个微服务的状态,或者从外部API解析数据。Go凭借其goroutine可以出色地完成这项任务。让我们编写一个脚本,检查网站的可用性,并在出现问题时发送通知。这是使用Golang实现自动化的另一个强大示例。

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n    "sync"\n    "time"\n)\n\nfunc checkURL(url string, wg *sync.WaitGroup) {\n    defer wg.Done()\n\n    client := http.Client{\n        Timeout: 5 * time.Second,\n    }\n\n    resp, err := client.Get(url)\n    if err != nil {\n        fmt.Printf("[失败] %s - %v\\n", url, err)\n        return\n    }\n    defer resp.Body.Close()\n\n    if resp.StatusCode != http.StatusOK {\n        fmt.Printf("[警告] %s - 状态码: %d\\n", url, resp.StatusCode)\n    } else {\n        fmt.Printf("[正常]   %s - 运行中\\n", url)\n    }\n}\n\nfunc main() {\n    urls := []string{\n        "https://google.com",\n        "https://github.com",\n        "https://pythonlib.ru",\n        "https://non-existent-site.xyz",\n    }\n\n    var wg sync.WaitGroup\n\n    for _, url := range urls {\n        wg.Add(1)\n        go checkURL(url, &wg) // 在goroutine中启动\n    }\n\n    wg.Wait() // 等待所有goroutine完成\n    fmt.Println("检查完成。")\n}\n
\n\n

请注意代码中的 s

博客

书籍推荐