[英]Assign struct pointer to interface pointer
我正在尝试重构一些golang源代码,并且我想使用接口但是我发现了很大的困难(请耐心等待,我是一个铁杆C/C++孤儿)
我提取了一个小样本,显示我得到的错误
package main
import "fmt"
type LogProcessor interface {
Init() int
}
type MyProcessor struct {
a int
}
func (m MyProcessor) Init() int {
return m.a
}
func main() {
t := &(MyProcessor{2})
var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!
fmt.Println((*t).Init(), (*p).Init())
}
为什么第二个任务失败了?
添加修改后的代码以演示我正在尝试做的事情。 我认为接口更类似于 C++ 类。 我的错。 还在学习
package main
import "fmt"
type LogProcessor interface {
Init() int
}
type MyProcessor struct {
a int
}
func (m *MyProcessor) Init() int {
m.a++
return m.a
}
func main() {
t := &(MyProcessor{2})
m := MyProcessor{4}
var p LogProcessor = &m
fmt.Println(t.Init(), p.Init())
fmt.Println(t.a, m.a)
}
表达式MyProcessor{2}
是一个复合文字。 获取复合文字的地址是有效的,它将是*MyProcessor
类型。
所以在这里:
t := &(MyProcessor{2})
t
的类型将是*MyProcessor
。
你的失败线:
var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!
右侧表达式的类型再次是*MyProcessor
。 它是一个具体类型的指针。 p
的类型是*LogProcessor
,它是指向另一种类型的指针。 可分配性规则不适用于此处,因此该值根本不能分配给变量p
。
请注意,有一个可分配性规则:
如果以下条件之一适用,则值
x
可分配给T
类型的变量(“x
可分配给T
”):
- ...
T
是一个接口类型,x
实现了T
。
在您的示例中p
的类型不是接口类型,而是指向接口的指针。 你很少(如果有的话)需要这个。
相反,如果您使用“仅”接口类型:
var p LogProcessor = &(MyProcessor{4}) // This works!
这是因为具体类型*MyProcessor
实现了接口类型LogProcessor
。 您也不需要括号,您可以简单地使用&MyProcessor{4}
。
那么当然你不能取消引用p
(因为它不是一个指针),所以你必须使用p.Init()
。
它失败了,因为您使用的是指向接口的指针,如果您删除指向 LogProcessor for var p 的指针,它可以工作
package main
import "fmt"
type LogProcessor interface {
Init() int
}
type MyProcessor struct {
a int
}
func (m MyProcessor) Init() int {
return 2
}
func main() {
t := &(MyProcessor{2})
var p LogProcessor = MyProcessor{4} // works without a pointer to the interface type
fmt.Println((*t).Init(), (p).Init())
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.