首頁 >後端開發 >Golang >嵌入式 Go 方法可以存取父結構體欄位嗎?

嵌入式 Go 方法可以存取父結構體欄位嗎?

DDD
DDD原創
2024-12-06 08:02:11177瀏覽

Can Embedded Go Methods Access Parent Struct Fields?

嵌入式方法可以存取父欄位嗎?

在 Go 中,嵌入式方法是程式碼重複使用和組織的強大機制。但是,出現了一個常見問題:嵌入式方法可以直接存取其父結構體的欄位嗎?

背景

對於上下文,假設您正在建立一個Active Record - Go 的風格ORM,其中常見的CRUD 方法嵌入在使用者結構中以提高可讀性和抽象性。這將允許您編寫 user.Save() 而不是 data.Save(user)。

範例

考慮以下程式碼片段:

package main

import (
    "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()
}

重新檢視問題

重新檢視問題。在於是否有辦法使頂級字段可以透過嵌入式方法存取。在上面的範例中,Test 方法嵌入在 Bar 中,並嘗試從父 Foo 結構體存取 Name 欄位。

Answer

不幸的是,Go 不提供嵌入式方法存取其父結構體欄位的任何直接機制。 Test方法的接收者是指向Bar的指針,Go沒有辦法判斷它是否嵌入。

可能的解決方案

實現對於此功能,一個潛在的解決方法是向Bar 結構添加一個interface{} 成員,要求實現它的類型將該成員設定為包含類型。此成員的初始化可以由呼叫者負責,也可以透過 ORM 方法處理。然而,這種方法引入了額外的複雜性和潛在的維護問題。

替代視角

或者,考慮將 API 建構為 db.Save(user) 可能不會的可能性如看起來那麼有害。這種方法提供了一種支援多個資料庫的簡單方法,並避免依賴全域狀態。

以上是嵌入式 Go 方法可以存取父結構體欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn