我想確保我了解下面代碼中發生的事情:
package main
import "fmt"
type Dummy interface {
display()
}
type Str struct {
int_data int
}
func (s Str) display() {
fmt.Println(s.int_data)
}
func main() {
var d_ptr *Dummy
fmt.Println(d_ptr) //this displays nil... No surprises here
var s_str Str = Str{4143}
fmt.Println(s_str) //this displays {4143}... No surprises here
//d_ptr = &s_str //This fails... A surprise here
var d Dummy = s_str//This is OK..
d_ptr = &d //This is OK..
fmt.Println(d_ptr, *d_ptr)//Now its OK
}
如果該結構實作了介面,為什么我不能(直接)將結構的地址分配給介面的指標?是否像結構地址不兼容或可轉換為介面指標一樣簡單?注意:我知道我可以將結構分配給型別為 interface(Dummy) 的變數,然后在分配中使用該地址。
uj5u.com熱心網友回復:
在您的代碼中,d_ptr是一個指向介面的指標。d_ptr并沒有實作它指向的介面。Dummy并且*Dummy是兩種不同的型別。因此,d_ptr=&s_str失敗。
請注意,您可以將介面視為包含兩個欄位的結構:指向底層物件的指標和對其型別的參考。指向介面的指標是指向該結構的指標,可用于修改該介面值。它有一個非常具體的用例,例如json.Unmarshal,如果傳遞一個指向 an 的指標interface{},解組函式將創建一個新的具體結構,并將傳遞的介面初始化為該結構。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400771.html
標籤:去
