欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang gorm中格式化時(shí)間問(wèn)題詳解

 更新時(shí)間:2019年07月09日 16:43:29   作者:yuanshuli11  
這篇文章主要給大家介紹了關(guān)于golang gorm中格式化時(shí)間問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在開(kāi)發(fā)項(xiàng)目時(shí)遇到了發(fā)現(xiàn)一個(gè)問(wèn)題,

gorm雖然可以自動(dòng)幫你維護(hù) created_at、updated_at、deleted_at這些關(guān)鍵時(shí)間字段。但是其原理與弊端需要了解一下。

1.使用方法

通過(guò)自定義一個(gè)localtime的結(jié)構(gòu),來(lái)控制時(shí)間的格式

package utils
import (
 "time"
 //"strconv"
 "fmt"
 "database/sql/driver"
 "strconv"
)
type LocalTime struct {
 time.Time
}
func (t LocalTime) MarshalJSON() ([]byte, error) {
 //格式化秒
 seconds := t.Unix()
 return []byte(strconv.FormatInt(seconds, 10)), nil
}
func (t LocalTime) Value() (driver.Value, error) {
 var zeroTime time.Time
 if t.Time.UnixNano() == zeroTime.UnixNano() {
 return nil, nil
 }
 return t.Time, nil
}
func (t *LocalTime) Scan(v interface{}) error {
 value, ok := v.(time.Time)
 if ok {
 *t = LocalTime{Time: value}
 return nil
 }
 return fmt.Errorf("can not convert %v to timestamp", v)
}

此時(shí)dao的字段結(jié)構(gòu)為

type TestDao struct{
   Id    uint    `gorm:"primary_key,AUTO_INCREMENT" json:"id"`
 CreatedAt  LocalTime `json:"-"`
 UpdatedAt  LocalTime `json:"update_at"`
 DeletedAt  *LocalTime `json:"-"`
}

2.實(shí)現(xiàn)原理

其實(shí)現(xiàn)方式其實(shí)是通過(guò)在save變更時(shí),通過(guò)callback功能,將其定義為當(dāng)前時(shí)間。文章可參考 傳送門(mén)

這樣你就可以通過(guò)自定義的LocalTime來(lái)控制時(shí)間格式。

3.弊端與建議

因?yàn)樵诔绦蜻\(yùn)行時(shí),createAt這類(lèi)字段的類(lèi)型還是 LocalTime,所以如果你想自己給其復(fù)制,是不太容易做到的。

例如,你想在程序運(yùn)行時(shí)改一下其createAt的時(shí)間。你做不到! 因?yàn)樗念?lèi)型是LocalTime,而你的時(shí)間要么是時(shí)間戳,要么是一個(gè)字符串,類(lèi)型不匹配。。。是不是很尷尬???

所以建議這類(lèi)保留字段還是不要在程序運(yùn)行時(shí)去修改。只用它作為記錄或標(biāo)識(shí)即可。如果真的需要更改時(shí)間,還是自己維護(hù)字段的內(nèi)容吧。例如用int存時(shí)間戳或string存字符串。然后每次變更時(shí),去修改它的值。

當(dāng)然也可以將這工作自己封裝成一個(gè)callback函數(shù),這樣你就能夠隨意控制這個(gè)字段了。可參考上文傳送門(mén)中的內(nèi)容。

所以,想吐槽的是,gorm對(duì)時(shí)間格式化的這種實(shí)現(xiàn)方式,太不人性化了!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • GoLang基于zap日志庫(kù)的封裝過(guò)程詳解

    GoLang基于zap日志庫(kù)的封裝過(guò)程詳解

    Zap是我個(gè)人比較喜歡的日志庫(kù),是uber開(kāi)源的,有較好的性能,在項(xiàng)目開(kāi)發(fā)中,經(jīng)常需要把程序運(yùn)行過(guò)程中各種信息記錄下來(lái),有了詳細(xì)的日志有助于問(wèn)題排查和功能優(yōu)化,這篇文章主要介紹了GoLang基于zap日志庫(kù)的封裝過(guò)程,想要詳細(xì)了解可以參考下文
    2023-05-05
  • golang實(shí)現(xiàn)可中斷的流式下載功能

    golang實(shí)現(xiàn)可中斷的流式下載功能

    這篇文章主要給大家介紹了golang實(shí)現(xiàn)可中斷的流式下載,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 詳解golang碎片整理之 fmt.Scan

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語(yǔ)言中fmt包從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù)的Scan系列函數(shù)、從io.Reader中獲取數(shù)據(jù)的Fscan系列函數(shù)以及從字符串中獲取數(shù)據(jù)的Sscan系列函數(shù)的用法,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Go中的應(yīng)用配置管理詳解

    Go中的應(yīng)用配置管理詳解

    這篇文章主要為大家介紹了Go中的應(yīng)用配置管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 10個(gè)現(xiàn)代網(wǎng)站開(kāi)發(fā)必備的Go軟件包工具盤(pán)點(diǎn)

    10個(gè)現(xiàn)代網(wǎng)站開(kāi)發(fā)必備的Go軟件包工具盤(pán)點(diǎn)

    這篇文章主要為大家介紹了10個(gè)現(xiàn)代網(wǎng)站開(kāi)發(fā)必備的Go軟件包,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)絡(luò)端口掃描方法

    Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)絡(luò)端口掃描方法

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)絡(luò)端口掃描方法,實(shí)例分析了Go語(yǔ)言網(wǎng)絡(luò)程序的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 最新評(píng)論