章节

16.3 反射修改值

本篇学习通过反射修改变量的条件,并能正确使用指针和 Elem。

反射修改值

概念说明

通过反射修改变量时,必须拿到可设置的值。
直接把普通变量传给 reflect.ValueOf,得到的是一份不可设置的反射值。

正确做法是传入指针,再通过 Elem() 找到指针指向的变量。

语法/规则

  1. 修改值时要传入指针,例如 reflect.ValueOf(&name)
  2. 使用 Elem() 获取指针指向的实际值。
  3. 使用 CanSet() 判断是否可修改。
  4. 根据 Kind 选择 SetStringSetInt 等方法。
  5. 设置值的类型必须匹配。

修改字符串变量示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import (
	"fmt"
	"reflect"
)

func main() {
	name := "go"

	value := reflect.ValueOf(&name).Elem() // 先传指针,再取出指向的实际值
	if value.CanSet() {
		value.SetString("golang")
	}

	fmt.Println(name)
}

输出结果:

1
golang

常见错误

  1. 传入普通变量而不是指针,导致反射值不可设置。
  2. 忘记调用 Elem(),实际拿到的是指针本身。
  3. 使用 SetString 修改非字符串类型,导致 panic。
  4. 修改前不检查 CanSet(),问题发生时不容易定位。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字