Gonull:一个用于处理无效值的GO软件包
#json #go #nullable

使用数据库和JSON时,开发人员经常会遇到管理不可设定值的挑战。零可能是讨厌的。如果未正确处理,他们可能会引入意外错误,并且通常需要在代码中进行其他检查。为了解决这个问题,开源软件包gonull作为解决方案。

什么是Gonull?

gonull为GO应用程序提供了一种通用的无效类型。它的核心目的是简化处理无效值的过程,尤其是在处理数据库和JSON时。

核心功能:

  • 通用无效的类型:在gonull的核心是Nullable类型,它可以保持任何指定类型的无效值。此类型有两个字段:

    • Val:拥有实际值。
    • Valid:指示该值是否已设置的标志。
  • 易于创建:您可以使用Newnullable函数快速创建具有初始值的新Nullable。这也将Valid标志设置为true。

  • 数据库集成:gonull使得将无效的值与database/sql集成无缝。扫描和值方法使无效类型可以充当数据库操作中的无效字段。

  • JSON操作:该软件包提供内置方法(UnmarshalJSONMarshalJSON)来处理使用JSON数据时可序列化的序列化和避免值。

它是如何工作的?

考虑一个方案,您要代表具有可选字段的Person,例如AgeAddressHeight。这些字段可能具有或可能没有值,当将它们序列化为JSON时,应正确表示它们(以其值或null为单位)。

这是一个简单的示例,使用gonull软件包:

package main

import (
    "encoding/json"
    "fmt"

    "github.com/lomsa-dev/gonull"
)

type MyCustomInt int
type MyCustomFloat32 float32

type Person struct {
    Name    string
    Age     gonull.Nullable[MyCustomInt]
    Address gonull.Nullable[string]
    Height  gonull.Nullable[MyCustomFloat32]
}

func main() {
    jsonData := []byte(`{"Name":"Alice","Age":15,"Address":null,"Height":null}`)

    var person Person
    err := json.Unmarshal(jsonData, &person)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Unmarshalled Person: %+v\n", person)

    marshalledData, err := json.Marshal(person)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Marshalled JSON: %s\n", string(marshalledData))
}

在上面的示例中,AgeAddressHeight the人struct的字段是Nullable类型。当我们删除JSON数据时,这些字段正确解释了JSON值,包括识别零值。当送回JSON时,未设置(或不有效)的字段表示为null。