go xorm存庫(kù)處理null值問(wèn)題
go xorm存庫(kù)處理null值
go 的結(jié)構(gòu)有默認(rèn)值, 這樣從數(shù)據(jù)庫(kù)獲取的時(shí)候, null 值會(huì)被解析成 0 , 而0 在系統(tǒng)是一個(gè)有效值。
Go 的結(jié)構(gòu)體不直接支持整數(shù)類(lèi)型的 NULL 值。
Go 是一種靜態(tài)類(lèi)型語(yǔ)言,結(jié)構(gòu)體的字段類(lèi)型在編譯時(shí)必須確定。
整數(shù)類(lèi)型(如 int、int64 等)是非指針類(lèi)型,不能直接存儲(chǔ) NULL 值。
然而,你可以使用指針類(lèi)型來(lái)模擬整數(shù)類(lèi)型的 NULL 值。
通過(guò)將整數(shù)字段定義為指針類(lèi)型,可以將其設(shè)置為指向整數(shù)值或者為 nil(NULL)。
示例
func main() {
db, err := NewDBCnn()
if err != nil {
fmt.Println(err.Error())
return
}
var a int = 13
b1 := &ModelUser{
Id: 431,
Name: "測(cè)試新增2",
Age: &a,
Passwd: nil,
Created: "",
Updated: "",
}
db.Insert(b1)
bean := new(ModelUser)
rows, err := db.Rows(bean)
if err != nil {
fmt.Println(err.Error())
}
defer rows.Close()
var ret = make(map[int64]ModelUser)
for rows.Next() {
bean = new(ModelUser)
rows.Scan(bean)
ret[bean.Id] = *bean
}
for _, v := range ret {
fmt.Println(fmt.Sprintf("%v", v))
}
test, _ := json.Marshal(ret)
fmt.Println(string(test))
}
// NewDBCnn 新建數(shù)據(jù)庫(kù)連接
func NewDBCnn() (*xorm.Engine, error) {
engine, err := xorm.NewEngine("mysql", "root:localsense@tcp(127.0.0.1:3306)/test?charset=utf8")
if err != nil {
// 處理連接錯(cuò)誤
}
return engine, err
}
type ModelUser struct {
Id int64 `xorm:"id" json:"id"`
Name string `xorm:"name" json:"name"`
Salt *string `xorm:"salt" json:"salt"`
Age *int `xorm:"age" json:"age"`
Passwd *int `xorm:"passwd" json:"passwd,omitempty"`
Created string `xorm:"created" json:"created,omitempty"`
Updated string `xorm:"updated" json:"updated,omitempty"`
}
func (e ModelUser) TableName() string {
return "user"
}
數(shù)據(jù)庫(kù)中的值

程序運(yùn)行一下
C:\Users\Josslynn\AppData\Local\Temp\GoLand\___1go_build_main_go__2_.exe
{1 dj 0xc000061fa0 0xc00001f070 0xc00001f088 2023-03-03 10:31:34 2023-03-03 10:31:34}
{3 <nil> <nil> <nil> }
{43 測(cè)試新增 <nil> <nil> <nil> 2023-05-23 15:02:12 2023-05-23 15:02:12}
{431 測(cè)試新增2 <nil> 0xc00001f130 <nil> 2023-05-23 15:19:17 2023-05-23 15:19:17}
{"1":{"id":1,"name":"dj","salt":"salt","age":18,"passwd":12345,"created":"2023-03-03 10:31:34","updated":"2023-03-03 10:31:34"},"3":{"id":3,"name":"","salt":null,"age":null},"43":{"id":43,"name":"測(cè)試","salt":null,"age":null,"created":"2023-05-23 15:02:12","updated":"2023-05-23 15:02:12"},"431":{"id":431,"name":"測(cè)試新增2","salt":null,"age":13,"created":"2023-05-23 15:19:17","updated":"2023-05-23 9:17"}}
指針可以讀到 數(shù)據(jù)庫(kù)的null 值, json 解析的時(shí)候 也能 轉(zhuǎn)成null 值。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Go?panic的三種產(chǎn)生方式細(xì)節(jié)探究
這篇文章主要介紹了Go?panic的三種產(chǎn)生方式細(xì)節(jié)探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
一文詳解Golang協(xié)程調(diào)度器scheduler
這篇文章主要介紹了一文詳解Golang協(xié)程調(diào)度器scheduler,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
Go 泛型Generics實(shí)戰(zhàn)場(chǎng)景示例
本文給大家介紹Go泛型Generics實(shí)戰(zhàn)場(chǎng)景示例,本文通過(guò)多種場(chǎng)景給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2026-01-01
GoLang實(shí)現(xiàn)Viper庫(kù)的封裝流程詳解
Viper是一個(gè)用于Go語(yǔ)言應(yīng)用程序的配置管理庫(kù),它提供了一種簡(jiǎn)單而靈活的方式來(lái)處理應(yīng)用程序的配置,支持多種格式的配置文件,這篇文章主要介紹了GoLang封裝Viper庫(kù)的流程,感興趣的同學(xué)可以參考下文2023-05-05
Golang中實(shí)現(xiàn)簡(jiǎn)單的Http Middleware
本文主要針對(duì)Golang的內(nèi)置庫(kù) net/http 做了簡(jiǎn)單的擴(kuò)展,實(shí)現(xiàn)簡(jiǎn)單的Http Middleware,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Golang中make與new使用區(qū)別小結(jié)
Go語(yǔ)言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來(lái)創(chuàng)建分配類(lèi)型內(nèi)存,本文主要給大家介紹了Go語(yǔ)言中函數(shù)new與make的使用和區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Go語(yǔ)言服務(wù)器開(kāi)發(fā)之客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù)并接收返回?cái)?shù)據(jù)的方法
這篇文章主要介紹了Go語(yǔ)言服務(wù)器開(kāi)發(fā)之客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù)并接收返回?cái)?shù)據(jù)的方法,實(shí)例分析了客戶(hù)端的開(kāi)發(fā)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
Golang實(shí)現(xiàn)Redis事務(wù)深入探究
這篇文章主要介紹了Golang實(shí)現(xiàn)Redis事務(wù)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go設(shè)計(jì)模式之空對(duì)象模式實(shí)戰(zhàn)
空對(duì)計(jì)模式是Go語(yǔ)言中一種行為型設(shè)計(jì)模式,它通過(guò)返回實(shí)現(xiàn)了相同接口但不執(zhí)行任何操作的空對(duì)象來(lái)替代nil值,從而避免因訪問(wèn)nil指針而導(dǎo)致的程序panic,感興趣的可以了解一下2025-09-09

