- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想知 Prop 体类型是否实现了特定接口(interface)并打印出来。我已经编写了一个示例 [0],其中包含一个自定义结构 (MyPoint),而不是接口(interface)类型。 MyPoint 具有在 io.Reader 接口(interface)中定义的 Read 函数:
type MyPoint struct {
X, Y int
}
func (pnt *MyPoint) Read(p []byte) (n int, err error) {
return 42, nil
}
目的是获取具体类型p实现接口(interface)io.Writer的信息。因此,我写了一个简短的 main trieng 来获得一个真实的支票。
func main() {
p := MyPoint{1, 2}
}
第一个想法是在反射和类型切换的帮助下检查它,并将 check(p)
添加到主函数。
func checkType(tst interface{}) {
switch tst.(type) {
case nil:
fmt.Printf("nil")
case *io.Reader:
fmt.Printf("p is of type io.Reader\n")
case MyPoint:
fmt.Printf("p is of type MyPoint\n")
default:
fmt.Println("p is unknown.")
}
}
输出为:p 的类型为 MyPoint
。经过一番研究后,我知道我应该预料到这一点,因为 Go 的类型是静态的,因此 p 的类型是 MyPoint 而不是 io.Reader。除此之外,io.Reader 是一种与 MyPoint 类型不同的接口(interface)类型。
我找到了一个解决方案,例如在 [1] 处检查 MyPoint 在编译时是否可以是 io.Reader。有用。
var _ io.Reader = (*MyPoint)(nil)
但这不是我想要的解决方案。像下面这样的尝试也失败了。我想是因为上面的原因吧?
i := interface{}(new(MyPoint))
if _, ok := i.(io.Reader); ok {
fmt.Println("i is an io.Reader")
}
pType := reflect.TypeOf(p)
if _, ok := pType.(io.Reader); ok {
fmt.Println("The type of p is compatible to io.Reader")
}
readerType := reflect.TypeOf((*io.Reader)(nil)).Elem()
fmt.Printf("p impl. Reader %t \n", pType.Implements(readerType))
是否存在一种无需编译即可检查 p 是否实现接口(interface)的解决方案?我希望有人能帮助我。
[0] http://play.golang.org/p/JCsFf7y74C (固定的) http://play.golang.org/p/cIStOOI84Y (旧)
[1] Explanation of checking if value implements interface. Golang
最佳答案
使用 reflect 包完全可以做你想做的事。这是一个例子:
package main
import (
"fmt"
"io"
"reflect"
)
type Other int
type MyPoint struct {
X, Y int
}
func (pnt *MyPoint) Read(p []byte) (n int, err error) {
return 42, nil
}
func check(x interface{}) bool {
// Declare a type object representing io.Reader
reader := reflect.TypeOf((*io.Reader)(nil)).Elem()
// Get a type object of the pointer on the object represented by the parameter
// and see if it implements io.Reader
return reflect.PtrTo(reflect.TypeOf(x)).Implements(reader)
}
func main() {
x := MyPoint{0, 0}
y := Other(1)
fmt.Println(check(x)) // true
fmt.Println(check(y)) // false
}
棘手的一点是要注意指针是如何处理的。
关于reflection - 无需编译即可检查变量实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32113597/
这实际上是我问的问题的一部分here ,该问题没有得到答复,最终被标记为重复。 问题:我只需使用 @Autowired 注释即可使用 JavaMailSender。我没有通过任何配置类公开它。 @Co
我是一名优秀的程序员,十分优秀!