英文:
How to assert type is a pointer to an interface in golang
问题
我断言,在Go语言中,指向结构体的指针类型实现了一个接口。在下面的代码示例中,有一些我不理解的地方:
package main
import (
"fmt"
)
type MyStruct struct {
Name string
}
func (m *MyStruct) MyFunc() {
m.Name = "bar"
}
type MyInterface interface {
MyFunc()
}
func main() {
x := &MyStruct{
Name: "foo",
}
var y interface{}
y = x
_, ok := y.(MyInterface)
if !ok {
fmt.Println("Not MyInterface")
} else {
fmt.Println("It is MyInterface")
}
}
我原本期望可以使用_, ok := y.(*MyInterface),因为y是指向MyStruct的指针。为什么我不能断言它是一个指针呢?
英文:
I am asserting that the type of a pointer to a struct is implementing an interface in golang and there is something I don't understand in the code sample below:
package main
import (
"fmt"
)
type MyStruct struct {
Name string
}
func (m *MyStruct) MyFunc() {
m.Name = "bar"
}
type MyInterface interface {
MyFunc()
}
func main() {
x := &MyStruct{
Name: "foo",
}
var y interface{}
y = x
_, ok := y.(MyInterface)
if !ok {
fmt.Println("Not MyInterface")
} else {
fmt.Println("It is MyInterface")
}
}
I was expecting to do _, ok := y.(*MyInterface) since y is a pointer to MyStruct. Why can't I assert it is a pointer?
答案1
得分: 1
类型断言用于查找接口中包含的对象的类型。因此,y.(MyInterface)可以工作,因为接口y中包含的对象是*MyStruct,并且它实现了MyInterface。然而,*MyInterface不是一个接口,它是一个指向接口的指针,所以你断言的是y是否是*MyInterface,而不是y是否实现了MyInterface。只有在以下情况下才会成功:
var x MyInterface
var y interface{}
y = &x
_, ok := y.(*MyInterface)
英文:
Type assertion is used to find the type of the object contained in an interface. So, y.(MyInterface) works, because the object contained in the interface y is a *MyStruct, and it implements MyInterface. However, *MyInterface is not an interface, it is a pointer to an interface, so what you are asserting is whether y is a *MyInterface, not whether or not y implements MyInterface. This will only be successful if:
var x MyInterface
var y interface{}
y=&x
_, ok := y.(*MyInterface)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论