Go语言(golang)可选值库goption - GitHub项目分享
Go语言(golang)可选值库goption - GitHub项目分享
GitHub - jordan-bonecutter/goption: Go 的可选值
Go 语言(出于设计目的)缺少可选类型的实现。这导致了处理此类值的几种不同方式,例如 sql.NullX 系列、ok 返回值,以及在编码器和解码器中使用指针等等。出于兴趣,我实现了一个通用的可选类型,它支持常见的编码器/解码器、SQL 以及标准库的字符串格式化。社区觉得这有用吗?
更多关于Go语言(golang)可选值库goption - GitHub项目分享的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Go语言(golang)可选值库goption - GitHub项目分享的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个很好的库,解决了Go语言中处理可选值的痛点。goption提供了类型安全的可选值实现,避免了使用指针或特定类型(如sql.NullString)带来的不一致性。
下面是一个使用示例,展示了goption的基本用法和与JSON、SQL的集成:
package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"github.com/jordan-bonecutter/goption"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email goption.Option[string] `json:"email,omitempty"`
Age goption.Option[int] `json:"age,omitempty"`
}
func main() {
// 创建可选值
email := goption.Some("user@example.com")
noAge := goption.None[int]()
user := User{
ID: 1,
Name: "Alice",
Email: email,
Age: noAge,
}
// JSON序列化
data, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("JSON: %s\n", data)
// JSON反序列化
var decoded User
jsonStr := `{"id":2,"name":"Bob","age":30}`
if err := json.Unmarshal([]byte(jsonStr), &decoded); err != nil {
log.Fatal(err)
}
fmt.Printf("Decoded: %+v\n", decoded)
// 值访问
if email, ok := user.Email.Get(); ok {
fmt.Printf("Email: %s\n", email)
}
if age, ok := user.Age.Get(); ok {
fmt.Printf("Age: %d\n", age)
} else {
fmt.Println("Age not set")
}
// SQL集成示例
var db *sql.DB
var dbEmail goption.Option[string]
err = db.QueryRow("SELECT email FROM users WHERE id = ?", 1).Scan(&dbEmail)
if err != nil {
log.Fatal(err)
}
}
goption的主要优势在于:
- 类型安全,避免空指针异常
- 与标准库良好集成(JSON、SQL、fmt)
- 清晰的API设计,语义明确
- 减少代码中零值检查的样板代码
对于需要处理可选字段的应用程序,特别是在API开发和数据库操作中,这个库确实很有价值。

