1 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
掃描器和評(píng)估器接口實(shí)際上并不是您自己使用的東西,至少在數(shù)據(jù)庫(kù)中存儲(chǔ)自定義類型時(shí)不是這樣。Scan()
我將首先介紹和函數(shù)的使用Value()
,然后解決您的問(wèn)題。
當(dāng)您獲得sql.Row
結(jié)果并想要將結(jié)果集中的值分配(掃描)到自定義類型的變量中時(shí)。文檔顯示該sql.Row.Scan()
函數(shù)接受 0 個(gè)或多個(gè)類型的參數(shù)interface{}
,基本上是任何東西。
在可以掃描值的支持類型列表中,最后一行是重要的一行:
任何實(shí)現(xiàn)掃描儀的類型(請(qǐng)參閱掃描儀文檔)
通過(guò) function?func (ts *Timestamp) Scan(value interface{}) error {
,該Timestamp
類型現(xiàn)在實(shí)現(xiàn)了該Scanner
接口,從而允許sql.Row
向該類型分配值。該Scanner
接口的文檔位于Scan()
我上面鏈接的 文檔的正下方。
當(dāng)然,這可以幫助您從數(shù)據(jù)庫(kù)讀取值,但在存儲(chǔ)這些類型時(shí)卻無(wú)濟(jì)于事。為此,您需要Valuer
接口。如果您還沒(méi)有猜到,該func (ts Timestamp) Value() (driver.Value, error)
函數(shù)確實(shí)使您的Timestamp
類型實(shí)現(xiàn)了此接口。
該Valuer
接口的要點(diǎn)是允許一種將任何類型轉(zhuǎn)換為 a 的方法driver.Value
,驅(qū)動(dòng)程序可以使用該類型并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中
解決問(wèn)題
首先,我必須假設(shè)您的協(xié)議輸出已寫入包中v1
。如果不是,它對(duì)你來(lái)說(shuō)不會(huì)有很好的效果。
有問(wèn)題的行確實(shí)是您標(biāo)記的行:
u.CreatedAt?=?time.Now()
首先,User.CreatedAt
類型為Timestamp
,它本身就是一條包含單個(gè)時(shí)間戳的消息。要將CreatedAt
時(shí)間設(shè)置為time.Now()
,您需要CreatedAt
正確初始化該字段:
u.CreatedAt?=?&Timestamp{ ????Timestamp:?ptypes.TimestampNow(),?//?this?returns?a?PROTOBUF?TYPE! ????}
你已經(jīng)Scan
在你的函數(shù)中這樣做了Value
?,所以我真的不明白你為什么不在這里這樣做......
建議
如果協(xié)議輸出確實(shí)寫入了v1
包,我真的真的會(huì)刪除該User.Create()
函數(shù)。事實(shí)上,我會(huì)直接殺死它。您的協(xié)議緩沖區(qū)用于通信。通過(guò) RPC 公開(kāi)您的程序。這是一個(gè) API。這些message
類型本質(zhì)上是請(qǐng)求和響應(yīng)對(duì)象(如果您愿意的話,可以美化 DTO)。您正在Create
向其中添加此功能,這會(huì)將它們變成 AR 類型。它使您的 protobuf 包無(wú)法使用。gRPC 的美妙之處在于您可以生成 golang、C++、Python...代碼,其他人可以使用這些代碼來(lái)調(diào)用您的程序。如果你讓你的 gRPC 包依賴于數(shù)據(jù)庫(kù),就像你所做的那樣,我個(gè)人永遠(yuǎn)不會(huì)使用它。
- 1 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報(bào)