如果需要动态设置struct变量field的情况下, 可以利用reflect来完成。
代码如下:package mainimport ( 'fmt' 'reflect')// 定义结构体Persontype Person struct { Name string Age int}func main() { person := Person{} fmt.Println(person) // 修改前 { 0} pp := reflect.ValueOf(&person) // 取得struct变量的指针 field := pp.Elem().FieldByName('Name') //获取指定Field field.SetString('gerrylon') // 设置值 field = pp.Elem().FieldByName('Age') field.SetInt(26) fmt.Println(person) // 修改后 {gerrylon 26}}
事实上对于原始值也是一样的, 要利用指针, 因为golang默认都是传值, 示例如下:
var f float64 = 3.4fmt.Println(f) // 3.4p := reflect.ValueOf(&f) // 注意这里一定要是指针, 否则传递给ValueOf的是f的拷贝v := p.Elem()v.SetFloat(3.5)fmt.Println(f) // 3.5总结:
反射传入的应该是变量的指针
利用 FieldByName()方法可以设置struct的指定key的值, 非常强大。
补充:golang通过反射修改变量的值
看代码吧~package mainimport ('fmt''reflect')func reflectTest(str interface{}) {fs := reflect.ValueOf(str)fs.Elem().SetString('jack')fmt.Printf('%vn' ,fs.Elem())}func main(){var str string = 'tom'reflectTest(&str)fmt.Println(str)}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。
相关文章:
1. 怎么让div+css兼容ie6ie7ie8ie9和FireFoxChrome等浏览器2. requestAnimationFrame使用示例详解3. 基于JavaScript实现图片裁剪功能4. React优雅的封装SvgIcon组件示例5. uniapp自定义验证码输入框并隐藏光标6. 详解JavaScript中原始数据类型Symbol的使用7. JavaScript深拷贝方法structuredClone使用8. uniapp 手机验证码输入框实现代码(随机数、倒计时、隐藏手机号码中间四位)可以直接使用9. 使用Node.js实现Clean Architecture方法示例详解10. Jquery使用原生AJAX方法请求数据