<var id="h1ntb"></var>
<var id="h1ntb"><video id="h1ntb"></video></var>
<var id="h1ntb"></var> <cite id="h1ntb"></cite>
<var id="h1ntb"></var>
<menuitem id="h1ntb"><strike id="h1ntb"></strike></menuitem>
<ins id="h1ntb"></ins>

幫助有志向的年輕人通過努力學習獲得體面的工作和生活

全國免費咨詢電話 : 400-609-2893

Go語言反射操作知識講解及實戰案例!老男孩Go程序開發培訓

老男孩IT教育

行業新聞

2022年4月25日 17:25

反射在計算機中表示程序能夠檢查自身結構的能力,尤其是類型。它是元編程的一種形式,同時也是讓人最搞不懂的知識,而且在Go語言中,反射是一個非常強大和先進的概念,應謹慎使用。上一篇文章,小編為大家介紹了Go語言反射獲取的內容,本篇文章為大家介紹一下Go語言反射操作!

  反射在計算機中表示程序能夠檢查自身結構的能力,尤其是類型。它是元編程的一種形式,同時也是讓人最搞不懂的知識,而且在Go語言中,反射是一個非常強大和先進的概念,應謹慎使用。上一篇文章,小編為大家介紹了Go語言反射獲取的內容,本篇文章為大家介紹一下Go語言反射操作!

Golang培訓班

  反射操作常用函數和方法

func (v Value) Elem() Value

  Elem返回v持有的接口保管的值的Value封裝,或者v持有的指針指向的值的Value封裝。如果v的Kind不是Interface或Ptr會panic;如果v持有的值為nil,會返回Value零值。

func (v Value) SetInt(x int64)

  設置v的持有值。如果v的Kind不是Int、Int8、Int16、Int32、Int64之一或者v.CanSet()返回假,會panic。

func (v Value) Int() int64

  返回v持有的有符號整數(表示為int64),如果v的Kind不是Int、Int8、Int16、Int32、Int64會panic

func (v Value) Kind() Kind

  Kind返回v持有的值的分類,如果v是Value零值,返回值為Invalid

func (v Value) NumField() int

  返回v持有的結構體類型值的字段數,如果v的Kind不是Struct會panic

func (v Value) Field(i int) Value

  返回結構體的第i個字段(的Value封裝)。如果v的Kind不是Struct或i出界會panic

func (v Value) SetString(x string)

  設置v的持有值。如果v的Kind不是String或者v.CanSet()返回假,會panic。

func (v Value) NumMethod() int

  返回v持有值的方法集的方法數目。

func (v Value) MethodByName(name string) Value

  返回v的名為name的方法的已綁定(到v的持有值的)狀態的函數形式的Value封裝。返回值調用Call方法時不應包含接收者;返回值持有的函數總是使用v的持有者作為接收者(即第一個參數)。如果未找到該方法,會返回一個Value零值。

func (v Value) Call(in []Value) []Value

  Call方法使用輸入的參數in調用v持有的函數。例如,如果len(in) == 3,v.Call(in)代表調用v(in[0], in[1], in[2])(其中Value值表示其持有值)。如果v的Kind不是Func會panic。它返回函數所有輸出結果的Value封裝的切片。和go代碼一樣,每一個輸入實參的持有值都必須可以直接賦值給函數對應輸入參數的類型。如果v持有值是可變參數函數,Call方法會自行創建一個代表可變參數的切片,將對應可變參數的值都拷貝到里面。

func (v Value) Type() Type

  返回v持有的值的類型的Type表示。

  反射操作應用

  一、通過反射操作基本類型,來改變基本類型的值。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 1
    a = 100
    val := reflect.ValueOf(&a)
    val.Elem().SetInt(200)
    b := val.Elem().Int()
    fmt.Printf("a => %d , b => %d\n", a, b)
}

  運行結果:

a => 200 , b => 200

  二、反射操作結構體及調用結構體方法。

package main

import (
    "fmt"
    "reflect"
)

type School struct {
    Name   string
    Course string
}

func (s School) Echo() {
    fmt.Printf("name : %s , Course : %s \n", s.Name, s.Course)
}

func main() {
    o := School{
        Name:   "oldboy",
        Course: "Linux",
    }

    val := reflect.ValueOf(&o)
    kd := val.Kind()

    if kd != reflect.Ptr && val.Elem().Kind() == reflect.Struct {
        fmt.Println("expect struct")
        return
    }
    //獲取字段數量
    fields := val.Elem().NumField()
    fmt.Printf("struct has %d field\n", fields)
    //獲取字段的類型
    for i := 0; i < fields; i++ {
        fmt.Printf("%d %v\n", i, val.Elem().Field(i).Kind())
    }
    // 操作結構體
    val.Elem().Field(1).SetString("Golang")

    //獲取方法數量
    methods := val.NumMethod()
    fmt.Printf("struct has %d methods\n", methods)

    //反射調用的Echo方法
    var params []reflect.Value
    val.Elem().Method(0).Call(params)
}

  運行結果:

struct has 2 field
0 string
1 string
struct has 1 methods
name : oldboy , Course : Golang

  反射綜合應用

  1、定義一個結構體

  2、給結構體賦值

  3、用反射獲取結構體的下標、結構體名稱、類型、值

  4、改變結構體的值

package main

import (
    "fmt"
    "reflect"
)

type Student struct {
    Name string
    Age  int
}

func main() {
    u := Student{"oldboy", 18}
    v := reflect.ValueOf(&u).Elem()
    t := v.Type()
    for i := 0; i < v.NumField(); i++ {
        f := v.Field(i)
        fmt.Printf("構體的下標: %d: 名稱: %s 類型: %s 值: %v\n", i,
            t.Field(i).Name, f.Type(), f.Interface())
    }
    v.Field(0).SetString("老男孩")
    v.Field(1).SetInt(100)
    fmt.Println("u is now", u)
}

  老男孩GO語言課程率行業之先開設,并進行多次迭代升級,以幫助學員學習到真正有用的知識,如有學習需求,可以關注“GO語言開發”課程。

  推薦閱讀:

  【GO語言培訓教程】小白必看,Go語言異常處理!

  【推薦】Go語言開發的監控系統!老男孩教育

  【GO語言知識培訓】之單元測試學習!

本文經授權發布,不代表老男孩教育立場。如若轉載請聯系原作者。
欧美a级,欧美14一18tom,欧美15p,欧美av在线,欧美bdsm 国产小受18asian男男| 中文字幕夫妇交换乱叫| 人碰人摸人爱免费视频| 慢慢破大学生处真实视频| 老妇女性较大毛片| 暖暖直播高清在线中文| 欧美人与牲口杂交在线播放| 男女无遮挡羞羞视频免费网站| 第九色区av天堂| 久久青青草原国产精品最新片| 快穿系统做肉肉任务肉多文| 欧洲美熟女乱又伦| 老师,乳胶好爽| 97人人超碰国产精品最新| 亚洲国产在线一区二区丝瓜| 少妇特殊按摩高潮不止| japaneseteacher教师| 少妇无码一区二区三区| 午夜神器18以下不能进免费| 大陆毛片农村妇女系列bd版| 浮力最新限制线路地址| 小sao货水好多真紧| 大波大乳video| 任你日线观看免费视频| 欧美性性性性o00xx| 四虎a片在线精品免费| 在线亚洲色拍偷拍在线视频| 午夜偷拍精品用户偷拍免费| 免费一区二区无码东京热| 中国xxxx真实偷拍| 丰满老熟妇牲交| http://www.pooltablehouston.com