2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论

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

打破固有思维(十四)

Changing Lin

ArrayList vs LinkedList

ltc

ArrayList linkedlist

BOE(京东方)亮相世界智能大会 创新科技强势发力智慧物联新赛道

DT极客

SWOT分析模型

石云升

创业 战略 职场经验 5月日更

一款优秀数据库中间件的不完全解析

Coder的技术之路

源码阅读 源码刨析 数据库中间件

并发王者课 - 青铜 2:峡谷笔记 - 简单认识Java中的线程

MetaThoughts

Java 后端 多线程 并发 王者并发课

HarmonyOS 的分布式技术,让小朋友爱上涂鸦

科技汇

从外包跳槽到大厂,我用了55天成功逆袭。

Java 程序员 架构 面试

区块链技术在数字农业领域的应用挑战

CECBC

Flink的广播变量

大数据技术指南

大数据 flink 5月日更

浅谈 Serverless 开发和应用

网易云信

Serverless

hive交互的几种方式

五分钟学大数据

大数据 hive 5月日更

全面隔绝虚拟货币暴涨暴跌风险

CECBC

医疗数字化:区块链或成最强辅助

CECBC

医疗

发布两小时,Github访问量破百万,阿里内部首次公布的 Java10W 字面经有多强?

Java 程序员 架构 面试

指挥中心可视化研判分析系统搭建解决方案

Flutter 混合开发基础

网易云信

flutter

比特币披萨节由来:11年前BTC首次在现实世界使用

meio

比特币

【签约计划】试用期规则

InfoQ写作社区官方

签约计划 热门活动

亚马逊云科技宣布在上海设立生命健康行业数字化赋能中心

亚马逊云科技 (Amazon Web Services)

API网关才是大势所趋?SpringCloud Gateway保姆级入门教程

Zhendong

Java spring API 网关

4月热搜:揭秘金融级人脸实名认证解决方案背后的技术硬货

百度大脑

百度

架构训练营模块 4 作业 - 江哲

江哲

IPFS与 Filecoin的区别是什么?

meio

IPFS Filecoin

博睿数据多点开花,数据链DNA加速走进金融、医疗、政企行业

博睿数据

数据链DNA

一款开源小工具,提升K8S资源管理幸福感!

Rancher

指挥中心可视化研判分析系统搭建解决方案

2021年4月券商App行情刷新及交易体验评测报告

博睿数据

数字货币与加密货币、虚拟货币的区别

meio

比特币 数字货币 加密货币 虚拟货币

NetCore配置文件使用全过程

happlyfox

520单身福利

5分钟速读之Rust权威指南(六)

wzx

rust

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