2 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個贊
表達(dá)式是復(fù)合文本。采用復(fù)合文本的地址是有效的,它將是類型 。MyProcessor{2}
*MyProcessor
所以在這里:
t := &(MyProcessor{2})
的類型將是 。t
*MyProcessor
您的故障線路:
var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!
右側(cè)表達(dá)式的類型再次為 。它是指向具體類型的指針。的類型為 ,它是指向另一種類型的指針。可賦值性規(guī)則在這里不適用,因此該值根本無法賦值給變量。*MyProcessor
p
*LogProcessor
p
請注意,有一個可分配性規(guī)則:
如果滿足以下條件之一,則值可賦給類型為 (“ 可賦值為 ”) 的變量:
x
T
x
T
...
T
是一種接口類型,實(shí)現(xiàn) 。x
T
在您的示例中,的類型不是接口類型,而是指向接口的指針。你很少(如果有的話)需要這個。p
相反,如果您使用“僅”接口類型:
var p LogProcessor = &(MyProcessor{4}) // This works!
這是可行的,因?yàn)榫唧w類型實(shí)現(xiàn)了接口類型 。您也不需要括號,只需使用 .*MyProcessor
LogProcessor
&MyProcessor{4}
然后,您當(dāng)然不能取消引用(因?yàn)樗皇侵羔槪?,因此您必須使?.p
p.Init()

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個贊
它失敗了,因?yàn)槟谑褂弥赶蚪涌诘闹羔?,如果您刪除指向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 關(guān)注
- 69 瀏覽
添加回答
舉報