2 回答
TA贡献1943条经验 获得超7个赞
表达式是复合文本。采用复合文本的地址是有效的,它将是类型 。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()
TA贡献1942条经验 获得超3个赞
它失败了,因为您正在使用指向接口的指针,如果您删除指向var p的LogProcessor的指针,它可以正常工作
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())
}
- 2 回答
- 0 关注
- 56 浏览
添加回答
举报