章节

16.5 反射修改结构体字段

本篇学习通过反射修改结构体字段,并能正确处理指针、导出字段和可设置性。

反射修改结构体字段

概念说明

修改结构体字段时,需要传入结构体指针。
然后通过 Elem() 获取结构体本身,再通过 FieldByName 找到字段。

只有可导出的字段才能被反射安全修改。
未导出字段即使找得到,也通常不能直接设置。

语法/规则

  1. 使用 reflect.ValueOf(&structValue).Elem() 获取可设置结构体值。
  2. 使用 FieldByName("字段名") 查找字段。
  3. 修改前检查 field.IsValid()field.CanSet()
  4. 根据字段类型选择对应的 Set 方法。
  5. 字段名必须是结构体中的真实字段名,不是 json tag 名。

修改结构体字段示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
	Age  int
}

func main() {
	user := User{Name: "abin", Age: 21}

	value := reflect.ValueOf(&user).Elem() // 拿到可设置的结构体值
	field := value.FieldByName("Name")     // 按字段名查找字段
	if field.IsValid() && field.CanSet() {
		field.SetString("golang")
	}

	fmt.Println(user.Name)
}

输出结果:

1
golang

常见错误

  1. 传入结构体值而不是结构体指针,导致字段不可设置。
  2. 使用 json tag 名查找字段,例如用 name 查找 Name,结果找不到。
  3. 修改未导出字段,导致 CanSet() 为 false。
  4. 字段类型不匹配时仍强行 Set,会触发 panic。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字