使用数据库和JSON时,开发人员经常会遇到管理不可设定值的挑战。零可能是讨厌的。如果未正确处理,他们可能会引入意外错误,并且通常需要在代码中进行其他检查。为了解决这个问题,开源软件包gonull作为解决方案。
什么是Gonull?
gonull为GO应用程序提供了一种通用的无效类型。它的核心目的是简化处理无效值的过程,尤其是在处理数据库和JSON时。
。核心功能:
-
通用无效的类型:在
gonull
的核心是Nullable
类型,它可以保持任何指定类型的无效值。此类型有两个字段:-
Val
:拥有实际值。 -
Valid
:指示该值是否已设置的标志。
-
-
易于创建:您可以使用Newnullable函数快速创建具有初始值的新
Nullable
。这也将Valid
标志设置为true。 -
数据库集成:
gonull
使得将无效的值与database/sql
集成无缝。扫描和值方法使无效类型可以充当数据库操作中的无效字段。 -
JSON操作:该软件包提供内置方法(
UnmarshalJSON
和MarshalJSON
)来处理使用JSON数据时可序列化的序列化和避免值。
它是如何工作的?
考虑一个方案,您要代表具有可选字段的Person
,例如Age
,Address
和Height
。这些字段可能具有或可能没有值,当将它们序列化为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))
}
在上面的示例中,Age
,Address
和Height
the人struct的字段是Nullable
类型。当我们删除JSON数据时,这些字段正确解释了JSON值,包括识别零值。当送回JSON时,未设置(或不有效)的字段表示为null。