golang:reflect反射

來源:互聯網
上載者:User

reflect反射

1.使用情境

當一些類型未知,有多種類型需要統一處理時,考慮使用反射來做多種情況的統一判斷處理。

反射讀取資料:

reflect常見類型

reflect.Int,reflect.Int8,reflect.Int16,reflect.Int32,reflect.Int64    reflect.Uint,reflect.Uint8,reflect.Uint16,reflect.Uint32,reflect.Uint64,reflect.Uintptr    reflect.Bool    reflect.String    reflect.Chan,reflect.Func,reflect.Ptr,reflect.Slice,reflect.Map,reflect.Array,reflect.Struct:    reflect.Invalid    reflect.Interface

reflect.TypeOf()

將一個具體的值,轉為介面類型!返回具體的類型。

  • Type類型
注意格式輸出時控制符t:=reflect.TypeOf(3)    fmt.Println(t.String())    fmt.Printf("%s\n",t.String())    fmt.Printf("%v\n",t)
  • Value類型
   x := 4    v := reflect.ValueOf(x) //反射拿到Value類型    fmt.Println(v)          //4    t := v.Type()           //Value實現了各種方法    fmt.Println(t.String()) //int
    v := reflect.ValueOf(3) //拿到Value類型到資料值,類型為Value    fmt.Println(v)          //3    fmt.Printf("%T", v)     //reflect.Value    fmt.Println(v.Int()) //將Value類型轉換成特定類型   //3    x := v.Interface() //將Value轉成介面類型    i := x.(int)    fmt.Printf("%T\n", i)    m, ok := x.(int) //類型斷言,取出其值 ,並轉成斷言的類型    if !ok {        fmt.Println("類型轉換錯誤")    }    fmt.Printf("%d,%T", m, m) //3,int
  • value.Kind()只關心底層表示
var value interface{}    fmt.Println(reflect.ValueOf(value).Kind()) //slice    fmt.Println(reflect.TypeOf(value))         //[]int

反射修改資料

我們可以通過調用reflect.ValueOf(&x).Elem(),來擷取任意變數x對應的可取地址的Value。

    x := 2    d := reflect.ValueOf(&x).Elem()   // d refers to the variable x    px := d.Addr().Interface().(*int) // px := &x    *px = 3                           // x = 3    fmt.Println(x)                    // "3"

慎用反射

  • 1.反射代碼比較脆弱,不會在構建時報錯,只有在真正啟動並執行時候才會拋出Panic
  • 難讀不易懂,不能做靜態類型檢查
  • 反射代碼運行速度慢

Example

將Value類型轉成interface

if _, ok := req.(reflect.Value); ok {            req = req.(reflect.Value).Interface()        }

判斷比對interface類型:

    var req interface{}    switch req.(type) {    case int:        fmt.Println("*")    }    
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.