dongyi1777 2017-12-16 13:32
浏览 82
已采纳

GoLang中地址的按位XOR

I was trying to implement the XOR Linked List in Go where I had to store the XORed address. In C/C++ it's quite simple

(*struct_type)(([unsigned] int)nodeA ^ ([unsigned] int)nodeB)

I tried a similar approach in Go. I had a struct named Node with two nodes nodeA and nodeB. To get this I tried the following ways:

*Node(uint(nodeA) ^ uint(nodeB))

Which gave me an error saying, can't convert type Node to uint. Another way I tried, which I was sure woundn't work, was

nodeA ^ nodeB

Is there a way to parse the address to int type, XOR them and then re-parse them into Node address? Or does Go provide a simple solution to this that I'm not aware of?

  • 写回答

3条回答 默认 最新

  • dongmi19720408 2017-12-16 13:54
    关注

    Use unsafe.Pointer for pointer arithmetic:

    a := &T{}
    b := &T{}
    x := uintptr(unsafe.Pointer(a)) ^ uintptr(unsafe.Pointer(b))
    y := (*T)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) ^ x))
    fmt.Println(b == y)  // prints true
    

    The GC uses pointers to track memory. If the code is rewritten to

    a := &T{}
    b := &T{}
    x := uintptr(unsafe.Pointer(a)) ^ uintptr(unsafe.Pointer(b))
    b = nil // clear all pointers to struct
    b = (*T)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) ^ x))
    

    then it's possible for the GC to collect the struct pointed to by b before the last assignment to b.

    It's not possible to implement a safe XOR list in Go because the GC can collect the elements.

    Don't do this.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么