Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rust 编写的 Borgo 语言带来了代数数据类型和更多功能

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

作者头像
深度学习与Python
发布于 2024-05-22 10:54:56
发布于 2024-05-22 10:54:56
15100
代码可运行
举报
运行总次数:0
代码可运行
作者 | Bruno Couriol

译者 | 刘雅梦

策划 | 丁晓昀

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 的代数数据类型和模式匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use fmt
enum 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> ):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use bufio
use fmt
use math.rand
use os
use strconv
use strings
use time
fn 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 还允许使用 操作符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use fmt
use io
use os
fn 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 的源文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cargo run -- build

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 如果需要,生成一个 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/

声明:本文为 InfoQ 翻译,未经许可禁止转载。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
建表困难症?试试这个工具
数据库表的创建是后端开发的重要一环,但面对复杂的字段名称和多样的数据类型,手动编写建表语句往往耗时且容易出错。为了提高开发效率和减少错误率,我们开发了一款工具,可以通过输入中文字段名自动生成标准的SQL建表语句。本工具特别适合中文环境下的开发者使用。
一只牛博
2025/05/31
750
建表困难症?试试这个工具
go 语言实战入门案例之猜数字
否则每一次都会生成相同的随机数序列。一般用启动的时间戳来初始化随机数种子。这里使用 time.now.unix 来初始化随机种子。
timerring
2023/10/13
1960
go 语言实战入门案例之猜数字
GO语言的实战学习
5.对用户输入的值和随机数进行比较,并且对其大小进行一个友好的提示,如果相等,就输出才对了,执行break,结束大循环。退出本次游戏。
一键难忘
2025/02/07
1690
GO数据结构(一)——稀疏数组
如下面的二维数组,我们可以假设成是一个棋盘,1代表白子,2代表黑子,现在我们要对其进行存盘以及续盘的操作,如果我们将整个数组都存起来,势必会造成内存的浪费,那么我们可以考虑使用稀疏数组来解决这个问题。
传说之下的花儿
2023/04/16
2100
golang数据结构之稀疏数组
掌握知识: 数组的初始化和赋值 结构体的初始化和赋值 字符串和整型之间的转换以及其它的一些操作 类型断言 读取文件 写入文件 对稀疏数组进行压缩 package main import ( "bufio" "fmt" "io" "os" "strconv" "strings" // "strconv" ) func originArr() [11][11]int { //创建原始数组 var chessMap [11][11]int
西西嘛呦
2020/08/26
3740
【Rust日报】2024-03-22 Borgo: 一个语法类似rust的新编程语言
https://raw.githubusercontent.com/borgo-lang/borgo-lang.github.io/main/borgo.jpg
MikeLoveRust
2024/04/01
2970
【Rust日报】2024-03-22 Borgo: 一个语法类似rust的新编程语言
配置文件热加载的go语言实现
通常我们更新应用程序的配置文件,都需要手动重启程序或手动重新加载配置。假设一组服务部署在10台机器上,你需要借助批量运维工具执行重启命令,而且10台同时重启可能还会造成服务短暂不可用。要是更新配置后,服务自动刷新配置多好...今天我们就用go实现配置文件热加载的小功能,以后更新配置再也不用手动重启了...
用户1432189
2018/09/05
8890
配置文件热加载的go语言实现
go语言学习之读取用户输入
本学习笔记全部以代码块的形式展示,具体的内容都包含在代码里: package types import ( "bufio" "fmt" "os" "strconv" "strings" ) // 读取输入 // 1. fmt.Scanln 和 fmt.Scanf 都是扫描来自标准输入的文本 // 2. Sscan 和以 Sscan 开头的函数则是从字符串读取 // 3. 也可以使用 bufio 包提供的缓冲读取(buffered reader)来读取数据 // bufio.
张宗伟 plus
2023/01/04
6630
Go 语言基础入门教程 —— Go 项目基本工程管理示例
在上一篇教程中,学院君带着大家搭建起了本地开发环境,并且编写了第一个 Go 程序,向世界问好。不过在实际开发过程中,直接调用编译器进行编译和链接(调用 go build 或 go run 命令)的场景很少,因为在项目工程中不会简单到只有一个源文件,往往有很多源文件并且源文件之间会有相互依赖的关系,如果这样一个文件一个文件逐步编译,那简直无法想象。
学院君
2019/08/09
1.2K0
Go 语言基础入门教程 —— Go 项目基本工程管理示例
Golang中文件目录操作的实现
       Golang中,文件是指计算机中存储数据的实体,文件可以是文本文件、二进制文件、配置文件等。在Go语言中,通过操作文件,我们可以读取文件的内容,写入数据到文件,以及获取文件的属性等。
周小末天天开心
2023/10/16
4020
Golang中文件目录操作的实现
Go语言的IO库那么多,我该怎么选?
在计算机和信息技术领域里I/O这个术语表示输入 / 输出 ( 英语:Input / Output ) ,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统与外部之间的通信。输入是系统接收的信号或数据,输出则是从其发送的信号或数据。
9号同学
2021/07/07
8420
Go语言的IO库那么多,我该怎么选?
GO语言学习笔记(一)一些基础常识以及实现生成随机密码小程序
FungLeo
2018/01/08
1.3K0
Go语言的网络编程与TCP_UDP
Go语言是一种现代的编程语言,由Google的Robert Griesemer、Rob Pike和Ken Thompson在2009年开发。Go语言的设计目标是简单、高效、可扩展和易于使用。它具有弱类型、垃圾回收、并发处理等特点。Go语言的网络编程是其强大功能之一,可以轻松地实现TCP/UDP网络通信。
程序猿川子
2025/02/22
1130
Go语言的网络编程与TCP_UDP
万字长文 | Go语言上手-基础语言 | 第三届字节跳动青训营笔记
我们知道字节跳动已经全面拥抱了go语言,最开始公司的后端业务主要是web后端,早期团队非Java背景,C++不太适合在线Web业务,所以最开始的服务都是python的,大概从2014年开始,随着业务体量的增长,python 遇到一些性能问题。
千羽
2022/05/31
1.8K0
万字长文 | Go语言上手-基础语言 |  第三届字节跳动青训营笔记
GO语言——IO项目
1. util包 file.go // CreatFile // @Title CreatFile // @Description 创建文件 // @Param name string "文件名" // @Return *os.File "文件对象" func CreatFile(name string) *os.File { file, err := os.Create(name) if err != nil { log.Fatalln(err) } return file } //
传说之下的花儿
2023/04/16
5020
Golang语言(打卡第四天)fmt格式化工具|Go主题月
Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。
微芒不朽
2022/09/13
9060
配置文件热加载的go语言实现
通常我们更新应用程序的配置文件,都需要手动重启程序或手动重新加载配置。假设一组服务部署在10台机器上,你需要借助批量运维工具执行重启命令,而且10台同时重启可能还会造成服务短暂不可用。要是更新配置后,服务自动刷新配置多好...今天我们就用go实现配置文件热加载的小功能,以后更新配置再也不用手动重启了...
李海彬
2018/07/26
5.4K2
配置文件热加载的go语言实现
转--在学Go语言
开始学点儿Go语言,这语言据说在国内比在国外火,社区上褒贬不一,不过“小马过河”嘛,总要先自己试试再来下结论。 环境准备: 1.在Golang中国下载安装go语言,个人喜欢用msi安装,直接帮你设置环境变量,免得手动弄。 2.安装goclipse:在eclipse官网下载最新版eclipse,安装后进入菜单Help -> Install New Software,输入网址http://goclipse.github.io/releases/。注意在读出的长长的列表中选择goclipse即可,千万别全选(血的
李海彬
2018/03/21
1K0
Rust vs Go:常用语法对比(八)
题目来自 Golang vs. Rust: Which Programming Language To Choose in 2023?[1] 141. Iterate in sequence over
fliter
2023/09/05
3510
Rust vs Go:常用语法对比(八)
rust 入门笔记:环境安装、hello World、Cargo
github地址:https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/24
7860
相关推荐
建表困难症?试试这个工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验