<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 日本丰满熟妇hd| 毛1卡2卡3卡4卡在线观看| 国产啪精品视频网站免| 香蕉www.5.app网页在线| 成在线人视频免费视频网页| 久久综合中文字幕无码| 国内揄拍国内精品对86| 欧美成年性h版影视中文字幕| 最好看的最新的中文字幕电影| 中文字幕无码A片久久东京热| 免费人成短视频在线观看网址| 咪咪网| 国产a在线不卡| 用舌头服侍女主人胯下| 和学长在楼梯间做好刺激| 免费看av大片的网站| 成年黄页网站大全免费看| av一本久道久久综合久久鬼色| 男生肌肌桶女人肌肌| 国产精品99久久99久久久| a级毛片100部免费观看| 处女开苞小说口述| 韩国三级在线观看久| 18禁真人床震无遮挡α片免费| 生肉动漫免费观看| 初高中女厕所偷窥美女嘘嘘| 粉嫩被两个粗黑疯狂进出| 真实男女xx00动态视频gif| 台湾帅男被深喉gv| china国语对白刺激videos| 亚洲av日韩aⅤ综合在线观看| http://www.sjzklrl.com