
Go反射:巧妙修改slice元素
Go语言的反射机制虽然强大,但在直接修改slice元素时却存在一些限制。 我们无法直接修改原始slice的值,需要通过操作其底层指针来实现。
以下代码展示了如何修改AppendSlice函数,从而实现对原始slice值的修改:
func AppendSlice(i, e interface{}) {
rv := reflect.ValueOf(i)
rv = rv.Elem()
rv = reflect.Append(rv, reflect.ValueOf(e))
reflect.ValueOf(i).Elem().Set(rv)
}
改进后的AppendSlice函数的关键在于:
-
获取slice的反射值:
reflect.ValueOf(i)获取输入接口i的反射值。 -
获取底层指针:
rv.Elem()获取slice的底层指针。 -
追加元素:
reflect.Append(rv, reflect.ValueOf(e))将新元素e追加到slice中。 注意,Append函数返回一个新的反射值,包含了已追加元素的slice。 -
更新原始slice:
reflect.ValueOf(i).Elem().Set(rv)这步至关重要,它将包含新元素的反射值rv设置回原始slice的底层指针,从而完成对原始slice的修改。
通过以上修改,AppendSlice函数能够正确地修改原始slice的值,确保程序输出预期结果 [1 2 3 4]。










