2 回答

TA貢獻(xiàn)1786條經(jīng)驗 獲得超11個贊
也許你對這個問題想得太多了,或者你可能仍然受到另一種語言的“引用調(diào)用”影響:
gorp.SqlExecutor
是一個接口,您永遠(yuǎn)不會使用指向接口值的指針。永遠(yuǎn)不能。(從技術(shù)上講,這是不正確的,但是如果您確實需要一個指向接口的指針,那么您將已經(jīng)掌握了足夠的 Go 來理解為什么“從不”是一個非常好的建議。)永遠(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 程序員不使用指向接口的指針(因為它不會做太多好)除非他需要修改接口值,通常是在反射期間。

TA貢獻(xiàn)1830條經(jīng)驗 獲得超3個贊
gorp.SqlExecutor
是一個接口,您永遠(yuǎn)不會使用指向接口值的指針。永遠(yuǎn)不能。如果這是您的目標(biāo),那么您就做錯了。接口是一個包裝器,是一個保證行為的契約。如果你的接口要求方法改變實現(xiàn)類型,那么實現(xiàn)類型應(yīng)該是一個指針。指向接口本身的指針不會突然使實現(xiàn)類型可變。
你的結(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
}
- 2 回答
- 0 關(guān)注
- 347 瀏覽
添加回答
舉報