Go语言反射深入讲解

反射基础概念什么是反射?反射是一种在运行时检查和操作类型的机制。它允许程序动态地获取类型信息,并对对象进行操作。基本类型反射的基本类型包括:reflect.Type:表示类型信息。reflect.Value:表示值信息。获取类型信息使用reflect.TypeOfpackag

反射基础概念

什么是反射? 反射是一种在运行时检查和操作类型的机制。它允许程序动态地获取类型信息,并对对象进行操作。

基本类型 反射的基本类型包括:

  • reflect.Type:表示类型信息。
  • reflect.Value:表示值信息。

获取类型信息

使用 reflect.TypeOf

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 10
    t := reflect.TypeOf(a)
    fmt.Println(t) // 输出:int
}

使用 reflect.ValueOf

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 10
    v := reflect.ValueOf(a)
    fmt.Println(v) // 输出:10
}

类型转换

使用 Interface 方法

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 10
    v := reflect.ValueOf(a)
    b := v.Interface().(int)
    fmt.Println(b) // 输出:10
}

使用 Convert 方法

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 10
    v := reflect.ValueOf(a)
    b := v.Convert(reflect.TypeOf(float64(0))).Interface().(float64)
    fmt.Println(b) // 输出:10
}

检查类型

使用 Kind 方法

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 10
    t := reflect.TypeOf(a)
    fmt.Println(t.Kind()) // 输出:int
}

使用 Type 方法

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Alice", 25}
    t := reflect.TypeOf(p)
    fmt.Println(t) // 输出:main.Person
}

操作结构体

获取结构体字段

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Alice", 25}
    v := reflect.ValueOf(p)
    t := v.Type()

    for i := 0; i < v.NumField(); i++ {
        field := t.Field(i)
        value := v.Field(i)
        fmt.Printf("%s: %v\n", field.Name, value.Interface())
    }
}

修改结构体字段

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Alice", 25}
    v := reflect.ValueOf(&p).Elem()
    t := v.Type()

    for i := 0; i < v.NumField(); i++ {
        field := t.Field(i)
        value := v.Field(i)
        switch field.Name {
        case "Name":
            value.SetString("Bob")
        case "Age":
            value.SetInt(30)
        }
    }

    fmt.Println(p) // 输出:{Bob 30}
}

操作数组和切片

获取数组和切片长度

package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := []int{1, 2, 3, 4, 5}
    v := reflect.ValueOf(a)
    fmt.Println(v.Len()) // 输出:5
}

遍历数组和切片


package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := []int{1, 2, 3, 4, 5}
    v := reflect.ValueOf(a)

    for i := 0; i < v.Len(); i++ {...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论