Go语言(golang)可选值库goption - GitHub项目分享

Go语言(golang)可选值库goption - GitHub项目分享 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的主要优势在于:

  1. 类型安全,避免空指针异常
  2. 与标准库良好集成(JSON、SQL、fmt)
  3. 清晰的API设计,语义明确
  4. 减少代码中零值检查的样板代码

对于需要处理可选字段的应用程序,特别是在API开发和数据库操作中,这个库确实很有价值。

回到顶部