1. 程式人生 > >Golang反射機制的應用

Golang反射機制的應用

反射機制應用場景

反射常見應用場景有以下兩種:

  1. 不知道介面呼叫哪個函式,根據傳入引數在執行時確定呼叫的具體介面,這種需要對函式或方法反射。例如以下這種橋接模式:

    func bridge(funcPtr interface{}, args ...interface{})

    第一個引數funcPtr以介面的形式傳入函式指標,函式引數args以可變引數的形式傳入,bridge函式中可以用反射來動態執行funcPtr函式。

  2. 不知道傳入函式的引數型別,函式需要在執行時處理任意引數物件,這種需要對結構體物件反射。典型應用場景是ORM,gorm示例如下:

    type User struct {
      gorm.Model
      Name         string
      Age          sql.NullInt64
      Birthday     *time.Time
      Email        string  `gorm:"type:varchar(100);unique_index"`
      Role         string  `gorm:"size:255"` // set field size to 255
      MemberNumber *string `gorm:"unique;not null"` // set member number to unique and not null
      Num          int     `gorm:"AUTO_INCREMENT"` // set num to auto incrementable
      Address      string  `gorm:"index:addr"` // create index with name `addr` for address
      IgnoreMe     int     `gorm:"-"` // ignore this field
    }
    
    var users []User
    db.Find(&users)

    示例中Find函式不知道傳入的引數是什麼型別,但要能處理任意引數。如果型別合法返回正確的值,否則返回異常。

    Go反射常用的兩種資料型別reflect.Type和reflect.Value,這兩種都屬於結構體型別,reflect.Type用於反射變數型別資訊,reflect.Value用於反射執行時資料。本文主要針對以上兩種場景加以說明,其它示例可以參考官方反射示例。反射對效能有一定的影響,使用時要考慮對效能的要求。為便於演示建立一個Go單元測試檔案reflect_test.go,Go語言的物件是以結構體的形式使用,自定義一個用於測試的結構體型別user。

原文連結