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

评论

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

选购成品陪玩系统软件时,要考虑哪些因素?陪玩系统软件开发定制陪玩小程序源码,满足您的个性化需求

DUOKE七七

MySQL uniapp thinkphp

活动回顾|Apache Cloudberry™ Meetup · 上海站暨中文用户组年终聚会

酷克数据HashData

音乐NFT的钱包对接流程

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?

智领云科技

虾皮(shopee)商品详情接口(虾皮API系列)

tbapi

虾皮商品详情接口 shopee API 虾皮API 虾皮商品数据采集

智能灌溉管理系统(源码+文档+部署+讲解)

深圳亥时科技

智能名片系统(源码+文档+部署+讲解)

深圳亥时科技

DGL(0.8.x) 技术点分析

Splendid2025

人工智能

NineData云原生智能数据管理平台新功能发布|2025年1月版

NineData

数据库 工具 数据管理 NineData

人工智能是否会发展出“自我意识”?科学与科幻的交汇

天津汇柏科技有限公司

人工智能

深度解读「摩根士丹利」人形机器人最新研报:100家人形机器人价值链(附报告)

机器人头条

科技 大模型 人形机器人 具身智能

浏览量超 10w 的热图,描述 RAG 的主流架构

阿里巴巴云原生

阿里云 云原生

加速无索引表引起的主从延迟数据回放

GreatSQL

一键解锁 AI 动画视频创作,赢好礼

阿里巴巴云原生

阿里云 云原生

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

阿里巴巴云原生

阿里云 云原生

告警事件如何与 CMDB 打通附加更多元信息

巴辉特

告警管理 告警信息丰富 告警OnCall 告警响应

【实战经验分享】1688API商品详情和关键词搜索商品的正确打开方式 中小商家必看!

代码忍者

1688API接口

如何管理能力比自己强的下属

易成研发中心

团队管理

DeepSeek 快速体验,魔搭+函数计算一键部署模型上云

阿里巴巴云原生

阿里云 云原生

淘宝店铺商品数据一网打尽:详解Taobao.item_search_shop接口

代码忍者

淘宝API接口

软件测试左移右移:打造全面质量保障机制

xuyinyin

2025年(第18届)中国大学生计算机设计大赛两大赛道相继开赛,等你来报名!

ModelWhale

Java Python 人工智能 大数据 中国大学生计算机设计大赛

人工智能丨DeepSeek、文心一言、Kimi、豆包、可灵……谁才是你的最佳AI助手?

测试人

软件测试

如何制定好绩效管理体系

易成研发中心

【DeepSeek版】JeecgBoot低代码 3.7.3 发布,集成DeepSeek实现AI编程

JEECG低代码

低代码平台 代码生成 JeecgBoot DeepSeek

网易元宵节能提前下班,你慕了吗?

王中阳Go

Go 网易

人工智能丨如何通过DeepSeek优化软件测试工作,提升效率与准确度

测试人

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