Borgo 语言概述
Borgo 是一种静态类型语言,能够编译为 Go 代码,并致力于与现有的 Go 生态系统兼容。Borgo 在 Go 的基础上引入了代数数据类型、模式匹配、Option 和 Result 类型等特性,其语法灵感主要来自 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)
}Result 和 Option 类型
Borgo 引入了 Rust 风格的 Result 和 Option 类型,示例如下:
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 可以在其 官方文档 中找到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。