指针 – 如何获取接口{}的指针以键入检查接口实现

所以我基本上试图找到最好的方法来达到这样的目的:

package main

import "fmt"

type SomeStruct struct {
}

type SomeInterface interface {
  SomeMethodWhichNeedsAPointerReceiver() string
}

func (s *SomeStruct) SomeMethodWhichNeedsAPointerReceiver() string {
  return "Well, believe me, I wrote something"
}

func Run(s interface{}) {
  // how can I cast s to a pointer here?
  casted, ok := (s).(SomeInterface)
  if ok {
    fmt.Println("Awesome: " + casted.SomeMethodWhichNeedsAPointerReceiver())
    return 
  }

  fmt.Println("Fail :(")
}

func SomeThirdPartyMethod() interface{} {
  return SomeStruct{}
}

func main() {
  x := SomeThirdPartyMethod()
  Run(x)
}

我的问题是,在Run方法的类型转换中.
我基本上只知道它是interface {}类型,现在我需要
调用一个接口方法,它有一个指针接收器.

我目前唯一的解决方案是动态构造一个带有反射的切片,将该元素设置为切片,然后使其成为可压缩的.

这真的是找到解决方案的唯一可能性吗?

Play link

最佳答案
确实最好的解决方案是从SomeThirdPartyMethod返回一个指针.但是如果这不可能,你可以使用reflection构造一个指向该值的指针:

v := reflect.Indirect(reflect.New(reflect.TypeOf(s)))
v.Set(reflect.ValueOf(s))
sp := v.Addr().Interface()
casted, ok = (sp).(SomeInterface)
if ok {
    fmt.Println("Good as well: " + casted.SomeMethodWhichNeedsAPointerReceiver())
    return
}

工作实例:http://play.golang.org/p/JYJT8mRxWN

转载注明原文:指针 – 如何获取接口{}的指针以键入检查接口实现 - 代码日志