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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

嵌入式方法可以訪問“父”字段嗎?

嵌入式方法可以訪問“父”字段嗎?

Go
富國(guó)滬深 2021-07-09 14:15:19
背景我已經(jīng)做了大量的規(guī)范閱讀和代碼測(cè)試,我認(rèn)為答案是否定的,但我想確保我沒有遺漏任何東西。目標(biāo)基本上,我正在嘗試為 Go 創(chuàng)建一個(gè) Active Record 風(fēng)格的 ORM,因?yàn)槲蚁矚g它的可讀性以及它從后端數(shù)據(jù)存儲(chǔ)中的抽象程度。我寧愿編寫而user.Save()不是data.Save(user)在用戶結(jié)構(gòu)上嵌入常見的 CRUD 方法。例子package mainimport (    "fmt"    "reflect")func main() {    test := Foo{Bar: &Bar{}, Name: "name"}    test.Test()}type Foo struct {    *Bar    Name string}func (s *Foo) Method() {    fmt.Println("Foo.Method()")}type Bar struct {}func (s *Bar) Test() {    t := reflect.TypeOf(s)    v := reflect.ValueOf(s)    fmt.Printf("model: %+v %+v %+v\n", s, t, v)    fmt.Println(s.Name)    s.Method()}http://play.golang.org/p/cWyqqVSKGH問題有沒有辦法讓頂級(jí)字段(不確定 Go 中的正確術(shù)語是什么)從嵌入式方法(例如:s.Name或s.Method()?感謝您為新 Gopher 貢獻(xiàn)您的時(shí)間。
查看完整描述

2 回答

?
aluckdog

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊

Go 不為您所追求的提供任何支持:您的Test方法的接收者是一個(gè)Bar指針,并且無法判斷它是否被嵌入。

如果你真的想走這條路,一個(gè)選擇是添加一個(gè)interface{}成員Bar并要求將其設(shè)置為包含類型的類型。初始化這個(gè)成員可能是創(chuàng)建值的人的責(zé)任,或者可能需要調(diào)用者將值傳遞給某個(gè) ORM 方法來設(shè)置它。這不是特別漂亮,但它可能是你能做的最好的。

順便說一句,將 API 構(gòu)建為db.Save(user)而不是真的那么糟糕user.Save()嗎?前者提供了一種擴(kuò)展到多個(gè)數(shù)據(jù)庫的明顯方法,而后者似乎更可能依賴于全局狀態(tài)。


查看完整回答
反對(duì) 回復(fù) 2021-07-12
?
梵蒂岡之花

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊

(如果我正確理解您的問題,)不,嵌入不是繼承。聽起來你真正想要的是一個(gè)界面

type Saver interface {
    Save() error}

然后相關(guān)方可以實(shí)施。

您可以擁有一個(gè)公共結(jié)構(gòu)base或任何實(shí)現(xiàn)公共方法的結(jié)構(gòu),然后可以嵌入每個(gè)更高級(jí)別的結(jié)構(gòu)base以允許它們共享實(shí)現(xiàn)。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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