第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 在接口指針上調(diào)用方法

Golang 在接口指針上調(diào)用方法

Go
藍(lán)山帝景 2021-07-16 18:15:44
我正在使用Gorp進(jìn)行數(shù)據(jù)庫訪問,Gorp 有一個標(biāo)準(zhǔn)DbMap類型,以及一個Transaction用于何時能夠回滾的類型。這兩種類型都實現(xiàn)了SqlExecutor接口。因此SqlExecutor,我針對接口進(jìn)行編程,因此我可以根據(jù)需要使用事務(wù)而無需更改我的代碼。然后我初始化一個 Gorp DbMaporTransaction并將其作為字段屬性傳入。問題是我需要一個指向 Gorp“對象”的指針,否則如果我使用 aTransaction如果 Gorp“對象”通過值而不是引用傳遞,我將如何能夠回滾。然后我收到一條消息,例如r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)當(dāng)我嘗試使用我的代碼時。我如何調(diào)用這些方法?代碼示例如下。package repositoriesimport (    "github.com/coopernurse/gorp")type Repository struct {    Gorp *gorp.SqlExecutor // <<<< Need pointer so I can rollback}func (r *Repository) GetById(i interface{}, key interface{}) interface{} {    obj, err := r.Gorp.Get(i, key)    if err != nil {        panic(err)    }    return obj}
查看完整描述

2 回答

?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗 獲得超11個贊

也許你對這個問題想得太多了,或者你可能仍然受到另一種語言的“引用調(diào)用”影響:

  1. gorp.SqlExecutor是一個接口,您永遠(yuǎn)不會使用指向接口值的指針。永遠(yuǎn)不能。(從技術(shù)上講,這是不正確的,但是如果您確實需要一個指向接口的指針,那么您將已經(jīng)掌握了足夠的 Go 來理解為什么“從不”是一個非常好的建議。)

  2. 永遠(yuǎn)不要考慮“按引用調(diào)用”。Go 中沒有這樣的東西。將指針傳遞給函數(shù)不是“按引用調(diào)用”。把它拋在腦后。

我假設(shè)您沒有嘗試使用事務(wù)并對非指針接口代碼進(jìn)行回滾?

背景:在 Go 中,你傳遞一個指向某物的指針有兩個原因:

1) 你想,因為你的結(jié)構(gòu)真的 很大,你想避免復(fù)制,或者

2)你需要,因為被調(diào)用者想要修改原始的(這對于帶有指針接收器的方法來說是典型的)。

現(xiàn)在接口值真的很?。ㄖ挥袃蓚€詞),因此傳遞指向接口值的指針的原因 1 不適用。原因 2 在大多數(shù)情況下不適用,因為將指針傳遞給接口值將允許您更改接口 本身,但大多數(shù)情況下您希望修改存儲在其中的值接口值。存儲在接口值中的這個值通常是一個指針值,它允許通過調(diào)用接口值上的方法來更改結(jié)構(gòu)的值,該方法包裝了指向該結(jié)構(gòu)的指針。這聽起來很復(fù)雜,但事實并非如此:新手 Go 程序員只是不使用指向接口的指針(因為這沒有任何好處)并且有經(jīng)驗的 Go 程序員不使用指向接口的指針(因為它不會做太多好)除非他需要修改接口值,通常是在反射期間。


查看完整回答
反對 回復(fù) 2021-07-19
?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗 獲得超3個贊

  1. gorp.SqlExecutor是一個接口,您永遠(yuǎn)不會使用指向接口值的指針。永遠(yuǎn)不能。

  2. 如果這是您的目標(biāo),那么您就做錯了。接口是一個包裝器,是一個保證行為的契約。如果你的接口要求方法改變實現(xiàn)類型,那么實現(xiàn)類型應(yīng)該是一個指針。指向接口本身的指針不會突然使實現(xiàn)類型可變。

  3. 你的結(jié)構(gòu)應(yīng)該是

type Repository struct {

    Gorp gorp.SqlExecutor 

}



func (r *Repository) GetById(i interface{}, key interface{}) interface{} {

    obj, err := r.Gorp.(gorp.SqlExecutor).Get(i, key)

    if err != nil {

        panic(err)

    }

    return obj

}


查看完整回答
反對 回復(fù) 2021-07-19
  • 2 回答
  • 0 關(guān)注
  • 347 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號