go-使用 unsafe 修改 struct 中的 field 的值

以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理:

首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的:

func unsafeValueOf(val reflect.Value) reflect.Value {
    uptr := unsafe.Pointer(val.UnsafeAddr())
    return reflect.NewAt(val.Type(), uptr).Elem()
}

你有一个 struct:

type haoba struct {
    i int
}

现在你想通过 reflect 的方式去改这个 i int。

下面是代码:

func pobokeyuan() {
    phaoba := &haoba{i: 1}
    v := reflect.ValueOf(phaoba).Elem()
    t := v.Type()
    var j = 4
    vj := reflect.ValueOf(j)
    f := t.Field(0)
    fv := v.FieldByName(f.Name)
    d := unsafeValueOf(fv)
    d.Set(vj)
    fmt.Println("we can do this ", phaoba.i)
}

 

posted on 2016-06-24 20:26  一页天书不分说 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/onebook/p/5615295.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值