写点什么

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:004657

评论

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

500行代码手写docker-以新命名空间运行程序

蓝胖子的编程梦

Docker 容器 命名空间 #k8s #云原生

什么是数字化?企业为什么要数字化转型

优秀

数字化转型 企业数字化转型 什么是数字化

大数据赋能商业地产研策

MobTech袤博科技

Solaris Network评述:在DeFi衍生品领域的颠覆者

股市老人

突围低代码下半场,未来悬而未决

引迈信息

前端 低代码 JNPF

文心一言 VS 讯飞星火 VS chatgpt (22)-- 算法导论4.2 2题

福大大架构师每日一题

福大大 ChatGPT 文心一言 讯飞星火

拥有自我意识的AI:AutoGPT | 得物技术

得物技术

人工智能 ChatGPT autogpt

如何把数据从 TDengine 2.x 迁移到 3.x ?

爱倒腾的程序员

时序数据库 ​TDengine taosdata

瑞云科技助力番职院打造虚拟数字人,探索职业教育创新之路

3DCAT实时渲染

虚拟现实 虚拟仿真 实时云渲染

GitLab Dogfooding 实践:Web API 模糊测试

极狐GitLab

DevSecOps OpenAPI web api 模糊测试 dogfooding

得物前端巡检平台的建设和应用

得物技术

巡检

大象转身只需点点鼠标,爆火 DragGAN 原理浅析

Zilliz

Towhee draggan

NFT交易所系统开发跨链技术

薇電13242772558

NFT

i人事谈AI:既要放眼未来,也要专注当下

ToB行业头条

破解提升 LLMs 性能的黑匣子—— LlamaIndex

Zilliz

Milvus AIGC LLM llamaindex

用eBPF/XDP来替代LVS(三)

九零后程序员

云计算 Linux 云原生 LVS ebpf

YB时代,正寻找新的数据支点

脑极体

存储

这届企业出海难?亚马逊云科技的出海合作伙伴让你事半功倍!

Lily

作为Vue爱好者如何转战React,从这款开源项目开始基于 React18,TypeScript,vite4,antd4.x等技术开箱即用的中后台管理解决方案

梁木由

JavaScript 开源 React

10+秒,AIGC炸出抖音小红书爆款!国产Fashion Diffusion颠覆时尚行业

Openlab_cosmoplat

AI 开源社区 时装

文件传输、文件同步、数据备份的有效解决方案

镭速

Kafka测试初探【Go】

FunTester

流批一体架构在快手的实践和思考|行业实践专栏上线

Apache Flink

大数据 flink 实时计算

深入解读 Flink 1.17

Apache Flink

大数据 flink 实时计算

AntDB-S流式数据库体验

亚信AntDB数据库

AntDB AntDB数据库 企业号 5 月 PK 榜

重磅发布 |《2023年消费品企业数字化转型调研白皮书》

博睿数据

数字化转型 白皮书 博睿数据 消费品企业

@开源爱好者,字节跳动这项技术,正式宣布开源了

字节跳动技术范儿

开源 字节跳动 数据仓库 Clickhouse

2023-05-25:给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的表达式 其中每个运算符 op1,op2,… 可以是加、减、乘、除之一 例如

福大大架构师每日一题

Go 算法 rust 福大大

倒计时 2 天!面向未来的开发者服务 Meetup 即将开始,我们在北京等你 ~

OpenAnolis小助手

开源 操作系统 Meetup 龙蜥社区 开发者服务

智慧水务系统如何进行有效的数据架构整改?三个企业的改造实践分享

爱倒腾的程序员

涛思数据 tdengine 时序数据库 taosdata

520 | ChatGPT会是一个完美情人吗?

澳鹏Appen

人工智能 nlp 情感分析 数据标注 ChatGPT

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