package mainimport "fmt"type intr interface { String() string}type bar struct{}func (b *bar) String() string { return "bar"}type foo struct { bar *intr}func main() { bar1 := bar{} foo1 := foo{bar: &bar1} fmt.Println(foo1)}我得到一個(gè)編譯時(shí)錯(cuò)誤:不能在字段值中使用 &bar1 (type *bar) 作為 *intr 類型:*intr 是指向接口的指針,而不是接口為什么會(huì)發(fā)生這個(gè)錯(cuò)誤?如何分配foo.bar?
2 回答

UYOU
TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
您將其分配給指向接口的指針。將字段類型更改為接口后,它將起作用:
type foo struct {
bar intr
}
很少需要指向接口的指針。

紫衣仙女
TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
Uber-go 風(fēng)格指南 pointers-to-interfaces包含對(duì)您問(wèn)題的準(zhǔn)確答案,
您幾乎不需要指向接口的指針。您應(yīng)該將接口作為值傳遞——底層數(shù)據(jù)仍然可以是一個(gè)指針。一個(gè)接口有兩個(gè)字段: 一個(gè)指向某些類型特定信息的指針。您可以將其視為“類型”。和一個(gè)數(shù)據(jù)指針。如果存儲(chǔ)的數(shù)據(jù)是指針,則直接存儲(chǔ)。如果存儲(chǔ)的數(shù)據(jù)是一個(gè)值,則存儲(chǔ)一個(gè)指向該值的指針。如果希望接口方法修改底層數(shù)據(jù),則必須使用指針。
我的建議是盡快熟悉它,
希望能幫助到你
- 2 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)
0/150
提交
取消