Soppo - Go,但具备它所缺失的特性
摘要
Soppo 是一门新的编程语言,它在 Go 的基础上扩展了枚举、模式匹配、“?”错误传播运算符以及编译期空值安全,同时保持与现有 Go 代码和工具链的完全互操作性。
<p><a href="https://lobste.rs/s/0ykmyt/soppo_go_with_features_it_s_missing">评论</a></p>
查看缓存全文
缓存时间: 2026/08/04 07:45
# Soppo
来源:https://soppolang.dev/
Go,以及它所缺少的特性。
类型安全与易用性,兼具完全互操作性。
参加导览 (https://tour.soppolang.dev/)
## 熟悉的语法
Soppo 尽可能使用 Go 语法。如果你会 Go,就已经掌握了 Soppo 的大部分内容。可以直接使用任何 Go 库,保留现有工具链,并逐步将 Soppo 引入现有项目。
``
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", handleHome)
http.HandleFunc("/hello", handleHello)
fmt.Println("Server starting on :8080")
http.ListenAndServe(":8080", nil)
}
``
## 枚举与模式匹配
带有结构体变体的标记联合,以及能确保你处理所有情况的模式匹配。编译器会在代码运行之前捕获缺失的分支,因此你可以放心重构。
``
type Shape enum {
Circle struct { radius float64 }
Rectangle struct { width, height float64 }
}
func area(s Shape) float64 {
match s {
case Shape.Circle{radius: r}:
return 3.14159 * r * r
case Shape.Rectangle{width: w, height: h}:
return w * h
}
}
``
## 使用 `?` 进行错误处理
不再需要重复编写 `if err != nil` 代码块。`?` 运算符在保持错误处理显式可见的同时,简洁地传播错误。需要时还可以添加自定义处理。
``
func processFile(path string) error {
data := os.ReadFile(path) ?
result := parse(data) ? err {
return fmt.Errorf("parse failed: {err}")
}
fmt.Println("Processed {len(result)} items")
return nil
}
``
## 空值安全
空指针解引用是 Go 中运行时 panic 的常见来源。Soppo 在编译时追踪可空性,因此你可以让这些 bug 在进入生产环境之前被捕获。进行 nil 检查后,类型会自动收窄。
``
func findUser(id int) ?*User {
if id == 0 {
return nil
}
return &User{name: "Alice"}
}
func greet(id int) {
user := findUser(id)
if user != nil {
fmt.Println("Hello {user.name}")
}
}
``
## 清晰的错误信息
当出现问题时,Soppo 会精确地告诉你发生了什么以及在哪里发生。错误信息会显示相关代码、高亮问题所在,并建议如何修复。调试应当是直接明了的,而不是猜谜游戏。
``
× Non-exhaustive match
╭─[main.sop:11:5]
10 │ var message string
11 │ ╭─▶ match colour {
12 │ │ case Colour.Red:
13 │ │ message = "Stop"
14 │ │ case Colour.Yellow:
15 │ │ message = "Wait"
16 │ ├─▶ }
· ╰──── missing variants: Green
17 │ }
╰────
help: Ensure all enum variants are handled, or add a `default` case
``
## 开始使用
安装 Soppo 的推荐方式是通过 SOPMOD (https://github.com/halcyonnouveau/sopmod),一个负责安装、更新和切换版本的版本管理器。它还管理 Go,Soppo 在内部使用 Go 进行编译。
curl -fsSL https://soppolang.dev/install.sh | sh
然后将其加入你的 PATH 并安装:
export PATH="$HOME/.sopmod/bin:$PATH" sopmod install sop latest
或者,不使用 SOPMOD,直接通过 Cargo 安装 `sop` 二进制文件(需要 Rust (https://www.rust-lang.org/tools/install) 和 Go (https://go.dev/doc/install)):
cargo install soppo
相似文章
Go 语言服务器可以实现令人印象深刻的代码导航
Go 语言服务器 (gopls) 为 Go 开发者提供了令人印象深刻的代码导航功能,增强了 IDE 的能力。
Solod: Go 可以成为更好的 C
Solod 是 Go 的一个严格子集,可编译为可读的 C11,零运行时,无GC,拥有丰富的标准库,让 Go 开发者获得系统级控制,同时为 C 程序员提供熟悉的工具链。
依赖 Go
Solod 是一种新的系统编程语言,它是 Go 的一个子集,复用 Go 的工具链和标准库,同时编译为 C11,提供手动内存管理。
Golang开发者应该尝试Odin
本文主张Golang开发者应该探索Odin,这是一种新的编程语言,通过内存管理和数组编程等功能解决了Go的一些局限性。
就用Go
一篇带有强烈观点的开发者文章倡导使用Go编程语言,强调其简洁的语法、强大的标准库、高效的并发模型以及单二进制部署,作为对过于复杂的现代技术栈的实用替代方案。