主要观点、关键信息和重要细节总结:
- 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。