英文:
Can we use Type Assertion with interface method in Go?
问题
我正在尝试在Go语言中使用类型断言,但是错误显示结构体没有实现接口方法,但我已经清楚地实现了接口中声明的方法。
这是我尝试执行的代码:
package interfaces
import "fmt"
type Event interface {
Accept()
}
type Like struct {
}
// Like实现了Event接口中的Accept方法
func (l *Like) Accept() {
fmt.Println("like accept")
}
func TypeAssertionExample() {
var l *Like = &Like{}
var e Event = l
_, f := e.(Like) // 即使Like实现了Accept方法,仍然会出现错误
fmt.Println(f)
}
请注意,我只翻译了代码部分,不包括其他内容。
英文:
I am trying to type assert in Go but error says struct doesn't implement interface method but I have clearly implemented method declared in interface.
This is the code I am trying to execute
package interfaces
import "fmt"
type Event interface {
Accept()
}
type Like struct {
}
// Like implement Accept method from Event interface
func (l *Like) Accept() {
fmt.Println("like accept")
}
func TypeAssertionExample() {
var l *Like = &Like{}
var e Event = l
_, f := e.(Like) // error even after Like implemented Accept method
fmt.Println(f)
}
答案1
得分: 2
请注意,除了Hymns for Disco建议的内容之外,我们还可以修改你的示例(我已将其更改为在Go Playground上使用的package main
和func main
)以便替换为:
func (l Like) Accept() {
// code
}
这样代码就可以编译了。但由于e
保存的是*Like
的实例,而不是Like
的实例,所以测试:
_, f := e.(Like)
fmt.Println(f)
现在输出false
。在这里查看完整的示例。
何时以及是否使用指针接收器的问题是相当基础的问题,在Go Tour中有相当好的介绍,尽管没有明确提到。FAQ以更紧凑的形式提供了相同的信息,第二部分提供了一些明确的细节。还可以参考https://stackoverflow.com/q/27775376/1256452。
英文:
Note that in addition to what Hymns for Disco suggested, we can modify your example (I've changed it to package main
and func main
for use on the Go Playground) so that instead of:
func (l *Like) Accept) {
// code
}
we have:
func (l Like) Accept() {
// code
}
and the code will then compile. But since e
holds an instance of *Like
, not one of Like
, the test:
_, f := e.(Like)
fmt.Println(f)
prints false
now. See the complete example here.
The question of when and whether to use pointer receivers is quite a basic one, and covered fairly well, though not explicitly, in the Go Tour. The FAQ has the same information in a more compact form, with some explicit details in a second section. See also https://stackoverflow.com/q/27775376/1256452.
答案2
得分: 1
指针类型和非指针类型是不同的。你需要这样做:
_, f := e.(*Like)
注意 *
,它与你的变量声明 var l *Like
匹配。
英文:
Pointer types and non-pointer types aren't the same. You need to do this:
_, f := e.(*Like)
Notice the *
, matching your variable declaration var l *Like
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论