Go的缺点

Rust的缺点

完美的语法+简洁性的组合:Borgo

代数类型系统和模式匹配

用<span class="text-orange-500 bg-gray-50 mx-0.5 py-0.5 px-1 rounded">Option&lt;T&gt;</span>替代 nil的返回值

用<span class="text-orange-500 bg-gray-50 mx-0.5 py-0.5 px-1 rounded">Result&lt;T,E&gt;</span>来替代 <span class="text-orange-500 bg-gray-50 mx-0.5 py-0.5 px-1 rounded">if err != nil</span>

用先进的<span class="text-orange-500 bg-gray-50 mx-0.5 py-0.5 px-1 rounded">select</span>来控制协程的协同

实战一个小项目

Go代码实现

Borgo代码实现

总结

Borgo: Rust与Go的缝合怪,看起来那么顺眼

小葵

2024-05-20

🏷

rustgo

Borgo 是一个新的编程语言,用Rust语法翻译成Go.

即拥有Rust完美的语法,同时又有Go的简洁性,可以复用Go的生态、协程、跨平台等特性,还不需要Rust复杂的生命周期、所有权等概念。

Go的缺点

Go唯一的缺点就是太简洁,特别是if err != nil这种写法,写起来很繁琐,而且Go的错误处理是通过返回值来处理的,不够优雅。

go error handling

Rust的缺点

Rust的缺点就是上手门槛极高,所有权、生命周期、借用等概念让很多初学者望而却步,而且Rust的编译速度也很慢,还特别费磁盘

完美的语法+简洁性的组合:Borgo

Rust语法堪称编程语言中的完美形态:

  • 类型推导, 哪怕返回值也可以推导
  • 模式匹配, match语法非常强大,很适合编写复杂的逻辑,更加严谨
  • 宏系统,可以自定义宏,可以实现很多高级的功能
  • 无GC,内存安全,线程安全
  • async/await内置支持,特别是在select场景下,能完美解决异步编程的协同问题
  • 无运行时,可以直接编译成二进制文件,跨平台

Go就是语法过于简单,但是Go的编译和跨平台没有对手,而且Go的协程也是非常好用的。

Borgo就是将Rust的完美语法翻译成Go,引入了几个关键的语法:

代数类型系统和模式匹配

use fmt

enum NetworkState {
    Loading,
    Failed(int),
    Success(string),
}

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

Option<T>替代 nil的返回值

Go的写法:

import (
    "fmt"
    "os"
)

key, ok := os.LookupEnv("HOME")
if ok {
    fmt.Println("home dir:", key)
} else {
    fmt.Println("Not found in env")
}

Borgo的写法:

// import packages from Go stdlib
use fmt
use os

let key = os.LookupEnv("HOME")

match key {
    Some(s) => fmt.Println("home dir:", s),
    None => fmt.Println("Not found in env"),
}

Result<T,E>来替代 if err != nil

go的写法:

import (
    "fmt"
    "os"
)

f, err := os.Open("filename")
if err != nil {
    fmt.Println("error:", err)
    return
}

Borgo的写法:

use fmt
use os

let f = os.Open("filename")
match f {
    Ok(file) => {
        // do something with file
    },
    Err(e) => fmt.Println("error:", e),
}

用先进的select来控制协程的协同

use fmt
use time

fn main() {
    let (tx1, rx1) = Channel.new()
    let (tx2, rx2) = Channel.new()
    ....
    select {
        // in Go:
        //   case a := <- rx1:
        let a = rx1.Recv() => {
            fmt.Println("got", a)
        },

        let b = rx2.Recv() => {
            fmt.Println("got", b)
        },
    }
}

更多的实例可以参考Borgo的官方文档。

实战一个小项目

为了证明Borgo的实用性,我们来实战一个小项目,实现一个简单的IRC服务器。

Go代码实现

Go代码实现

Borgo代码实现

Borgo代码实现

总结

Borgo算是一个很不错的尝试,而且看到未来可能会自己提供编译器,编译成wasm,这样可以降低Rust的上手门槛

缺点就是对go的原生语法支持不够友好,比如要做[]byte的静态初始化, 还有就是match对多个返回值还是处理不正确 。

当前的编译器给出的错误信息也不够友好,不过这些都是可以改进的。

不建议在生产环境中使用,但是可以作为一个学习Rust的一个很好的工具,可以让你更加深入的理解Rust的语法。

友情链接:

Copyright© 2024 杭州园中葵科技有限公司 版权所有