2025 年学习 Golang,你不会后悔

正如我在之前的文章中所解释的那样,我们正在致力于构建 LiveAPI,这是一个超级方便的自动 API 文档生成工具。LiveAPI 的后端是 Golang,我正在探索 Golang 的独特而酷炫的功能。

对于那些不知道的人来说,Golang(Go)是 Google 于 2009 年设计的一种编程语言。它的语法与 C 类似。

在从事 Golang 项目之前,我主要使用 Node.js 和 Python Web 框架。对于从其他领域转向 Golang 的初学者来说,最初可能会有点困难,但一旦你练习并掌握了专业知识,你就不会放弃。

我的第一个 Golang 项目是将 Python CLI 工具 Glee 转换为 Golang。

Imagcription

我们发现 Python 速度较慢,维护单个编译的 CLI 二进制文件非常困难,该二进制文件有时与 Mac OS 不兼容。这些问题和其他问题迫使我们改用 Golang。这里有一篇 Reddit 帖子,介绍了改用 Golang 背后的故事和问题。

在本文中,我将解释 Golang 中吸引我的独特功能。

**1. Goroutines - 轻量级并发**

func main() {
    go sayHello("World") // runs concurrently
    time.Sleep(1 * time.Second) 
}

func sayHello(name string) {
    fmt.Printf("Hello, %s!\n", name)
}

可以将 goroutine 视为可以独立执行任务的微型工作程序。它们比传统线程轻量级得多 - 您可以创建数千个 goroutine,而不会影响性能。

Imaription

**2. 频道 - 内置通信**

func main() {
    messages := make(chan string)
    go func() { messages <- "ping" }()
    msg := <-messages
    fmt.Println(msg)
}

通道就像管道,可以让 goroutine 安全地通信。想象一下两个人通过管道传递纸条 - 一个人写下并放进去,另一个人拿出来。

**3. Defer - 清理变得简单**

func readFile() {
    file, err := os.Open("test.txt")
    defer file.Close() // Will run when function exits 
}

Defer 就像是为清理任务设置提醒。这类似于在打开文件时写一张便条,上面写着“别忘了关闭文件”。

**4. 接口实现 - 隐式契约**

type Writer interface {
    Write([]byte) (int, error)
}

type ConsoleWriter struct{}

func (cw ConsoleWriter) Write(data []byte) (int, error) {
    return fmt.Println(string(data))
}

Go 的接口是隐式满足的 - 如果类型具有正确的方法,它会自动实现接口。这就像加入俱乐部:您无需正式声明会员资格;如果您能满足俱乐部的要求,您就会自动加入。

**5. 多个返回值 - 本机错误处理**

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("cannot divide by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Result:", result)
}

多个返回值使 Go 中的错误处理变得自然而明确。这就像购物时同时收到包裹和收据 - 您可以在继续之前检查一切是否正常。这种模式鼓励开发人员正确处理错误。

这些只是我喜欢 Go 的几个功能。还有其他功能,例如单个可执行二进制文件、更快的性能、类型推断、内置测试支持和交叉编译。

如果您正在制定 2025 年的计划,请将 Golang 添加到您的列表中。您不会后悔的。谢谢阅读!如果您想通过为开源项目做贡献来学习 Golang,请查看 glee 和 Lama2。