MST

星途 面试题库

面试题:Go语言中反射是如何实现结构体字段的动态访问的

在Go语言中,给定一个结构体实例,如何使用反射来动态获取和设置结构体的字段值?请举例说明,包括获取字段的类型信息以及修改字段的值。
49.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "reflect"
)

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

func main() {
    p := Person{
        Name: "Alice",
        Age:  30,
    }

    // 获取结构体实例的反射值
    valueOf := reflect.ValueOf(&p)

    // 判断是否为指针类型,并获取指针指向的值
    if valueOf.Kind() == reflect.Ptr {
        valueOf = valueOf.Elem()
    }

    // 获取结构体实例的反射类型
    typeOf := valueOf.Type()

    // 遍历结构体的字段
    for i := 0; i < valueOf.NumField(); i++ {
        field := valueOf.Field(i)
        fieldType := typeOf.Field(i).Type
        fieldName := typeOf.Field(i).Name

        fmt.Printf("Field %d: Name = %s, Type = %v, Value = %v\n", i+1, fieldName, fieldType, field.Interface())
    }

    // 通过反射修改字段值
    if field := valueOf.FieldByName("Age"); field.IsValid() {
        if field.Kind() == reflect.Int {
            field.SetInt(31)
        }
    }

    fmt.Println("Modified Person:", p)
}

上述代码中:

  1. 使用reflect.ValueOf获取结构体实例的反射值。如果是指针类型,通过.Elem()获取指针指向的值。
  2. 使用reflect.ValueOf.Type获取结构体实例的反射类型。
  3. 通过valueOf.NumField()获取结构体字段数量,并遍历每个字段,获取字段名、类型和值。
  4. 使用valueOf.FieldByName根据字段名获取字段的反射值,判断字段是否有效且类型是否为int,如果是则使用field.SetInt修改字段值。