一架梯子,一头程序猿,仰望星空!
Golang高级特性面试题 > 内容正文

Go语言的反射机制是什么?它有什么用处?


问题简答

反射机制用于获取程序运行时对象的类型和值,可以用于动态加载、检查和执行代码等。在很多场景下,反射机制可以使程序更加灵活和通用。

问题详解:

下面是Go通过反射机制读取结构体信息的例子

package main

import (
    "fmt"
    "reflect"
)

// 定义一个结构体
type Person struct {
    Name string
    Age  int
}

func main() {
    // 创建一个Person类型的实例
    person := Person{Name: "Tizi365", Age: 30}
    // 获取person变量的类型信息
    personType := reflect.TypeOf(person)
    // 获取person变量的值信息
    personValue := reflect.ValueOf(person)
    // 遍历person变量的结构体字段
    for i := 0; i < personType.NumField(); i++ {
        // 获取字段的类型信息
        fieldType := personType.Field(i)
        // 获取字段的值信息
        fieldValue := personValue.Field(i)
        // 输出字段名称和值
        fmt.Printf("%s: %v\n", fieldType.Name, fieldValue)
    }
}

输出结果

Name: Tizi365
Age: 30

下面是通过反射机制调用函数的例子

package main

import (
    "fmt"
    "reflect"
)

func main() {
    // 定义一个函数
    func1 := func(a int, b int) int {
        return a + b
    }

    //获取函数的反射类型
    funcVal := reflect.ValueOf(func1)

    //创建一个切片来存储函数参数
    params := make([]reflect.Value, 2)
    params[0] = reflect.ValueOf(10)
    params[1] = reflect.ValueOf(20)

    //通过Call函数来调用函数
    result := funcVal.Call(params)

    //结果是一个切片,需要取第一个元素
    fmt.Println(result[0].Int()) //30
}