首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Go 語言反射無法獲取嵌入結構體方法的原因與替代方案

     編輯:程式設計綜合問答

現象


type Controller struct{}
func (c *Controller) ServeHTTP(w, r) {
    v := reflect.ValueOf(c)
    m := v.MethodByName("GET") // 獲取不到 IndexController 的 GET
}

原因

Go **無繼承**,`IndexController` 嵌入 `Controller` 是 **組合**。`reflect.ValueOf(c)` 的類型是 `*Controller`,**方法集只包含 Controller 定義的方法**,不包含嵌入類型提升的方法 (提升方法屬於外層類型 `*IndexController`)。

解決方案

  1. 接口多態:定義接口 `interface { GET() }`,傳入 `*IndexController` 實例,直接調用。
    type Handler interface { GET() }
    func (c *Controller) ServeHTTP(w, r) {
        if h, ok := c.(Handler); ok { h.GET() }
    }
    
  2. 反射外層類型:在 `main` 中傳入 `&IndexController{}`,`ServeHTTP` 內用 `reflect.ValueOf(c).Elem().FieldByName("Controller")` 訪問嵌入字段,再 `MethodByName`——繁瑣不推薦。
  3. 組合替代繼承:Go 推薦「接口 + 組合」,不要模擬繼承。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved