以Rust编写的Borgo语言为Go带来代数数据类型等特性

Borgo 语言概述

Borgo 是一种静态类型语言,能够编译为 Go 代码,并致力于与现有的 Go 生态系统兼容。Borgo 在 Go 的基础上引入了代数数据类型、模式匹配、OptionResult 类型等特性,其语法灵感主要来自 Rust。Borgo 的编译器本身是用 Rust 实现的。

Borgo 的设计目标

Borgo 的主要贡献者解释了其设计目标:

  • 介于 Go 和 Rust 之间:Borgo 旨在提供比 Go 更具表现力,但比 Rust 更简单的语言。
  • 与 Go 完全兼容:Borgo 能够无缝使用现有的 Go 包。
  • Rust 风格的语法:Borgo 的语法与 Rust 类似,支持可选的分号。

Go 的现状与局限性

Go 因其简单、高效和并发处理能力而广受欢迎,目前在 TIOBE 指数中排名第 8。然而,Go 的弱类型系统常常被开发者诟病。Go 的核心贡献者 Ian Lance Taylor 认为,弱类型是 Go 的设计特性,鼓励通过编写代码而非类型来进行编程。

尽管如此,许多经验丰富的 Go 开发者希望增强 Go 的类型系统,特别是在以下几个方面:

  • 缺乏和类型(sum type)
  • 错误处理缺乏语法糖,导致代码冗长。
  • 缺乏适当的类型别名,限制了类型安全的使用。

Borgo 的特性

Borgo 在保持与现有 Go 库兼容的同时,引入了以下关键特性:

代数数据类型与模式匹配

Borgo 支持代数数据类型和模式匹配,示例如下:

enum NetworkState<T> {
    Loading,
    Failed(int),
    Success(T),
}

struct Response {
    title: string,
    duration: int,
}

fn main() {
    let state = NetworkState.Success(Response { title: "Hello world", duration: 0 });

    let msg = match state {
        NetworkState.Loading => "still loading",
        NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code),
        NetworkState.Success(res) => res.title,
    }

    fmt.Println(msg)
}

ResultOption 类型

Borgo 引入了 Rust 风格的 ResultOption 类型,示例如下:

fn main() {
    let reader = bufio.NewReader(os.Stdin);
    let secret = rand.Intn(100) + 1;

    loop {
        let guess = match strconv.Atoi(reader.ReadString('\n').Unwrap().TrimSpace()) {
            Ok(n) => n,
            Err(_) => continue,
        };

        if guess == secret {
            fmt.Println("Correct!");
            break;
        }
    }
}

错误处理

Borgo 支持使用 ? 运算符进行错误处理,示例如下:

fn copyFile(src: string, dst: string) -> Result<(), error> {
    let stat = os.Stat(src)?;
    let source = os.Open(src)?;
    let destination = os.Create(dst)?;
    let _ = io.Copy(destination, source)?;
    Ok(())
}

编译与运行

Borgo 的编译器使用 cargo 进行构建,生成 .go 文件后可以使用 Go 工具链运行:

$ cargo run -- build
$ go run .

开发者反馈

Reddit 上的开发者对 Borgo 的反应普遍积极,认为它解决了 Go 开发中的一些痛点,并希望 Go 的维护者能够考虑引入类似特性。

文档与资源

Borgo 的完整特性列表和在线 Playground 可以在其 官方文档 中找到。

阅读 23
0 条评论