主要观点、关键信息和重要细节总结:
- Intro:Borgo 是编译为 Go 的新编程语言,通过README可了解其特征和本地运行编译器的指令,此 playground 运行编译器为 wasm 二进制并将转译的 Go 输出发送到官方 Go playground 执行,如
enum NetworkState<T>等代码示例展示了其基本语法。 - Primitive Types:与 Go 中的原始类型相同,集合可不用指定值类型,如 Go 中
[]int{1,2,3},Borgo 可写[1, 2, 3],函数append()和len()可作为方法使用,Maps 用Map.new()初始化,Borgo 有元组且多行字符串定义方式特殊。 - Control flow:可迭代的只有切片、映射、通道和字符串,循环总是遍历单个值(与 Go 中使用单个迭代变量获取元素索引不同),遍历
(index, element)对调用.enumerate()方法,遍历映射时应使用(key, value)解构,无限循环用loop {},有条件循环用while {},if、match和代码块表达式返回值可赋值给变量。 - Algebraic data types and pattern matching:用
enum关键字定义代数数据类型,模式匹配必须详尽,目前变体只能定义为元组,如IpAddr和Coin的示例。 - Structs:定义和实例化结构体类似 Rust,与 Go 不同的是所有结构体字段都必须初始化,如
Person和Hobby的结构体示例。 - Result and Option:
Option<T>用于处理可能不存在的值,Result<T, E>用于返回值或错误,unwrap()操作不安全可能导致 panic,目前Result和Option的很多方法缺失,欢迎贡献到 stdlib。 - Interoperability with Go:目标是与现有 Go 生态系统完全兼容,通过
Option和Result类型自动处理 Go 函数返回多个值的情况,以 Go 函数的返回类型为例说明转换方式,如os.LookupEnv和os.Stat函数。 - Package definitions:使用现有 Go 包需在声明文件中定义,目前只有一小部分 Go stdlib 可在 Borgo 中使用,编译器有
importer工具可解析 Go 包生成相应绑定,如regexp包的示例。 - Pointers and References:指针和引用工作方式与 Go 相同,解引用用
foo.*,如Foo和Bar的结构体示例。 - Methods:用
impl {}块定义类型的方法,Go 中方法接收器需在每个函数声明中指定,Borgo 只需在impl块开头指定一次,也可声明静态方法。 - Interfaces:接口工作方式与 Go 相同,为鸭式类型,支持嵌入接口,如
geometry接口和rect、circle结构体的示例。 - Error handling:在返回
Result的函数中可用?运算符传播错误,类似 Rust,目前?运算符仅适用于Result,将扩展到Option。 - Zero values and nil:Borgo 中不能创建
nil值,现代语言倾向于用Option<T>代替null引用,调用现有 Go 代码可能出现空指针,可通过写更好的绑定将返回空指针的函数改为返回Option<*T>,Borgo 要求所有值显式初始化,可使用zeroValue()获取类型的零值。 - Concurrency (goroutines):支持 Go 中的所有并发原语,用
spawn关键字启动协程,参数为函数调用,如Counter的示例。 - Channels:创建
Sender<T>和Receiver<T>用Channel.new(),分别用于发送和接收值,大致相当于 Go 中的发送和接收通道,设计受 Rust 标准库启发。 - Select statements:
select {}工作方式类似 Go,但语法略有不同,如读取和发送通道的语法差异,以及默认情况的语法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。