duanqie8549 2016-07-26 23:23
浏览 21
已采纳

Golang中的身份比较?

I've been trying to build a set of structs that have a base struct as their foundation and variants built on top of that. I've found, however, that there doesn't seem to be a way for the struct to identify itself when the common code is in the base struct. How should I be doing this?

package main

import (
    "fmt"
)

type Base interface {
    IsMe(other Base) bool
}

type Block struct {
}

func (b *Block) IsMe(other Base) bool {
    return b == other
}

type Block2 struct {
    Block
}

func main() {
    b1 := &Block{}
    b2 := &Block2{}
    fmt.Printf("b1.IsMe(b1): %v
", b1.IsMe(b1))
    fmt.Printf("b1.IsMe(b2): %v
", b1.IsMe(b2))
    fmt.Printf("b2.IsMe(b1): %v
", b2.IsMe(b1)) // Wrong result!
    fmt.Printf("b2.IsMe(b2): %v
", b2.IsMe(b2)) // Wrong result!
}
  • 写回答

2条回答 默认 最新

  • doujiufutaog59220 2016-07-27 00:03
    关注
    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type Base interface {
        IsMe(other Base) bool
    }
    
    type Block struct {
        _ [1]byte // size of struct must be greater than zero
    }
    
    func (b *Block) IsMe(other Base) bool {
        x := reflect.ValueOf(b)
        y := reflect.ValueOf(other)
        return x.Pointer() == y.Pointer()
    }
    
    type Block2 struct {
        Block // "parent" needs to be first element
    }
    
    func main() {
        b1 := &Block{}
        b2 := &Block2{}
        fmt.Printf("b1.IsMe(b1): %v
    ", b1.IsMe(b1))
        fmt.Printf("b1.IsMe(b2): %v
    ", b1.IsMe(b2))
        fmt.Printf("b2.IsMe(b1): %v
    ", b2.IsMe(b1))
        fmt.Printf("b2.IsMe(b2): %v
    ", b2.IsMe(b2))
    }
    

    https://play.golang.org/p/Dx0Ze3euFY

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

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看