Golang反射機制的應用
阿新 • • 發佈:2018-11-11
反射機制應用場景
反射常見應用場景有以下兩種:
-
不知道介面呼叫哪個函式,根據傳入引數在執行時確定呼叫的具體介面,這種需要對函式或方法反射。例如以下這種橋接模式:
func bridge(funcPtr interface{}, args ...interface{})
第一個引數funcPtr以介面的形式傳入函式指標,函式引數args以可變引數的形式傳入,bridge函式中可以用反射來動態執行funcPtr函式。
-
不知道傳入函式的引數型別,函式需要在執行時處理任意引數物件,這種需要對結構體物件反射。典型應用場景是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。