如何获取接口的指针

很难解释,但是我怎样才能得到一个实现某个接口的东西的指针呢?


考虑下面的代码:


package main


import (

    "fmt"

    "unsafe"

)


type Interface interface {

    Example()

}


type StructThatImplementsInterface struct {

}


func (i *StructThatImplementsInterface) Example() {

}


type StructThatHasInterface struct {

    i Interface

}



func main() {

    sameInterface := &StructThatImplementsInterface{}


    struct1 := StructThatHasInterface{i: sameInterface}

    struct2 := StructThatHasInterface{i: sameInterface}


    TheProblemIsHere(&struct1)

    TheProblemIsHere(&struct2)


}


func TheProblemIsHere(s *StructThatHasInterface) {

    fmt.Printf("Pointer by Printf: %p \n", s.i)

    fmt.Printf("Pointer by Usafe: %v \n", unsafe.Pointer(&s.i))

}

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


结果将是:


Pointer by Printf: 0x40c138 

Pointer by Usafe: 0x40c140 

Pointer by Printf: 0x40c138 

Pointer by Usafe: 0x40c148 

请注意,Printf获得相同的值(因为两者都StructThatHasInterface使用相同的sameInterface)。但是,unsafe.Pointer()返回不同的值。


如果可能的话,我怎样才能得到与Printfwithout use相同的结果?fmtreflect


慕妹3146593
浏览 128回答 1
1回答

凤凰求蛊

在当前版本的 Go 中,一个接口值是两个字长。具体值或指向具体值的指针存储在第二个字中。使用以下代码将第二个单词作为 a uintptr:  u := (*[2]uintptr)(unsafe.Pointer(&s.i))[1]此代码不安全,不保证将来可以正常工作。获取指针的支持方式是:  u := reflect.ValueOf(s.i).Pointer()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go