Golang reflect 反射

反射的規則以下:  json

從接口值到反射對象的反射  
從反射對象到接口值的反射  
爲了修改反射對象,其值必須可設置  
函數

---------------------------------------------------------this

reflect包實現了運行時反射,容許程序操做任意類型的對象。典型用法是用靜態類型interface{}保存一個值,經過調用TypeOf獲取其動態類型信息,該函數返回一個Type類型值。調用ValueOf函數返回一個Value類型值,該值表明運行時的數據。Zero接受一個Type類型參數並返回一個表明該類型零值的Value類型值。編碼

範例spa

package main
 
import (
    "fmt"
    "reflect"
)
 
type MyStruct struct {
    name string
}
 
func (this *MyStruct) GetName() string {
    return this.name
}
 
func main() {
    fmt.Println("--------------")
    var a MyStruct
    b := new(MyStruct)
    fmt.Println(reflect.ValueOf(a))
    fmt.Println(reflect.ValueOf(b))
 
    fmt.Println("--------------")
    a.name = "show"
    b.name = "show"
    val := reflect.ValueOf(a).FieldByName("name")
 
    //painc: val := reflect.ValueOf(b).FieldByName("name")
    fmt.Println(val)
 
    fmt.Println("--------------")
    fmt.Println(reflect.ValueOf(a).FieldByName("name").CanSet())
    fmt.Println(reflect.ValueOf(&(a.name)).Elem().CanSet())
 
    fmt.Println("--------------")
    var c string = "show"
    p := reflect.ValueOf(&c)
    fmt.Println(p.CanSet())        //false
    fmt.Println(p.Elem().CanSet()) //true
    p.Elem().SetString("newName")
    fmt.Println(c)
}

想更好的理解 go 的反射機制,能夠從應用場景入手code

go語言reflect包使用的幾個場景 xml

1. 遍歷結構體字段名(避免代碼的硬編碼)
2. 調用結構體方法(自動映射)
3. 獲取結構體的tag標記的值(json/xml轉換)對象

相關文章
相關標籤/搜索