QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

  • 2024-06-04
    北京
  • 本文字数:1920 字

    阅读完需:约 6 分钟

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

Borgo 是一种静态类型的语言,可以编译成 Go 语言,并在努力与现有的 Go 生态系统实现互操作。Borgo 语言为 Go 语言添加了代数数据类型、模式匹配、Option 和 Result 类型,以及很多受 Rust 启发的语法。Borgo 的编译器本身是用 Rust 实现的。


Borgo 的主要贡献者对 Borgo 的主要特征进行了解释:


我想要一种编写应用程序的语言,它比 Go 更具表现力,但比 Rust 更简单。

Go 虽然简单明了,但我经常希望它能提供更多的类型安全性。Rust 非常好用(至少对于单线程代码来说是这样),但它过于宽泛和复杂,有时甚至让人感到痛苦。

Borgo 是一种新的语言,可以转换成 Go 语言。它与现有的 Go 软件包完全兼容。

Borgo 语法类似于 Rust,带有可选的分号。


Go 因其简单、高效和对并发性的处理而迅速受到许多开发人员的欢迎。Go 的设计也有利于快速编译。截至 2024 年 5 月,该语言在 TIOBE 指数中排名第 8 位。然而,开发人员经常指责 Go 在设计上是弱类型语言的缺点。Ian Lance Taylor 是 Go 的主要贡献者,他将弱类型视为一种特性而非缺陷:


Go 故意使用弱类型系统,并且有很多可以用其他语言表达但不能用 GO 表达的限制。Go 通常鼓励通过编写代码来进行编程,而不是通过编写类型来进行编程。


然而,许多经验丰富的 Go 开发人员已经表示了对丰富类型系统的兴趣。例如,一位 Reddit 用户提到:


错误作为值是好的,但是缺少求和(sum)类型却会造成伤害。

缺少返回错误的语法糖会导致样板代码。

缺乏适当的类型定义意味着我不能随心所欲地使用类型安全性。


Borgo 语言的语法似乎在很大程度上受到了 Rust 的启发,在努力保持与现有 Go 库兼容性的同时,Borgo 为 Go 添加了关键的语言特性。下面的代码演示了 Borgo 的代数数据类型和模式匹配:


use fmtenum NetworkState<T> {    Loading,    Failed(int),    Success(T),}struct Response {    title: string,    duration: int,}fn main() {    let res = Response {        title: "Hello world",        duration: 0,    }    let state = NetworkState.Success(res)    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)}
复制代码


下面的代码示例演示了 Borgo 受 Rust 启发的 ResultOption 类型( strconv.Atoi 返回 Option<int>  类型,Reader.ReadString返回 Result<string, error> ):


use bufiouse fmtuse math.randuse osuse strconvuse stringsuse timefn main() {    let reader = bufio.NewReader(os.Stdin)    let secret = rand.Intn(100) + 1    loop {        fmt.Println("Please input your guess.")        let text = reader.ReadString('\n').Unwrap()        let text = strings.TrimSpace(text)        let guess = match strconv.Atoi(text) {            Ok(n) => n,            Err(_) => continue,        }        fmt.Println("You guessed: ", guess)        if guess < secret {            fmt.Println("Too small!")        } else if guess > secret {            fmt.Println("Too big!")        } else {            fmt.Println("Correct!")            break        }    }}
复制代码


Borgo 还允许使用 操作符:


use fmtuse iouse osfn copyFile(src: string, dst: string) -> Result<(), error> {    let stat = os.Stat(src)?    if !stat.Mode().IsRegular() {        return Err(fmt.Errorf("%s is not a regular file", src))    }    let source = os.Open(src)?    defer source.Close()    let destination = os.Create(dst)?    defer destination.Close()    // 忽略复制的字节数    let _ = io.Copy(destination, source)?    Ok(())}
复制代码


由于 Borgo 的编译器是用 Rust 编写的,开发人员需要用 cargo 来编译 Borgo 的源文件:


$ cargo run -- build
复制代码


编译器将生成.go 文件,这些文件可以使用常用的 Go 工具链来运行:


# 如果需要,生成一个 go.mod 文件# $ go mod init foo$ go run .
复制代码


最近,来自 Reddit 上的开发者的反应总体上是积极的,其中一位开发者 表示:


这几乎解决了我在工作中编写 Go 代码时最不喜欢的事情,我希望——至少——这些压倒性的积极回复(按照 HN 的标准——甚至考虑到典型的 Rust 偏见!)能够激励 Go 的维护人员考虑 / 优先考虑其中的一些特性。


Borgo 语言特性的完整列表可以在在线文档和 Borgo 的游乐场中找到。


原文链接:

https://www.infoq.com/news/2024/05/borgo-adds-types-to-go/

2024-06-04 08:004601

评论

发布
暂无评论
发现更多内容

神奇的 lua

蓬蒿

lua Lua脚本

Python终于可以自动收发邮件了,1行代码实现

程序员晚枫

Python 邮件

科技快讯丨浪潮海岳低代码平台inBuilder全面亮相开放原子开发者大会

inBuilder低代码平台

开源 低代码

Different WiFi cards -QCN9274 and QCN6274- Different performance

wifi6-yiyi

network wifi wireless WiFi card

你不知道的WEB3钱包!你绝对不想错过的bitget钱包

股市老人

回调函数 | AI工程化部署

AIWeker

c AI AI工程化部署

你不知道的WEB3钱包!你绝对不想错过的bitget钱包

鳄鱼视界

睡前简单聊两句——内容创作的那些事

Java 工程师蔡姬

技术人 内容创作 21 天技术人写作行动营

第一视角现场探展!带你揭秘爱采购生成式AI如何提效赋能

科技热闻

2023技术总结——AI成为了我日常不可缺少的部分

StackOverflow

AI 模型 GPT

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

德迅云安全杨德俊

技术写作最佳实践与策略指南

小万哥

最佳实践 程序人生 软件工程 后端开发 技术写作

终端闲思录(1)- k8s 日志引发的联想

蓬蒿

终端

一款电压检测LVD

芯动大师

淘宝商品详情数据接口使用方法介绍

tbapi

淘宝电商 淘宝商品详情数据接口 淘宝API接口 淘宝数据采集

软件开发

Geek_8da502

云图说丨初识华为云OrgID

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 华为云云图说

基础知识回顾:安装 NGINX 开源版和 NGINX Plus

NGINX开源社区

web服务器 keepalive nginx 开源版 NGINX PLUS NGINX repo

我想 Debug 容器运行时

蓬蒿

Containerd 容器运行时

我的深度学习项目经验分享

小王撤了

AI

拳头游戏即将完成全球基础设施全面迁移至亚马逊云科技

财见

实践解析HPA各关联组件扭转关系

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟

你不知道的WEB3钱包!你绝对不想错过的bitget钱包

威廉META

Rust 编写的 Borgo 语言带来了代数数据类型和更多功能_编程语言_Bruno Couriol_InfoQ精选文章