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 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序