php小編柚子在這裡跟大家介紹一下什麼是實例化介面。在物件導向程式設計中,介面是一種約定,它定義了一個類別應該實作的方法。而實例化介面則是指透過建立一個類別的對象,來實現介面中定義的方法。透過實例化接口,我們可以利用多態的特性,讓不同的類別都能夠實現同一個接口,並且根據實際情況進行相應的方法重寫。實例化介面的使用可以讓我們的程式碼更加靈活和可擴展,提高了程式碼的重複使用性和可維護性。下面我們來具體了解實例化介面的使用方法和注意事項。
我是 go 新手。我不明白的一件事是,為什麼當我想單獨實例化介面時會出現編譯錯誤,但當我使用該介面的陣列形式時,則不會出現編譯器錯誤。
type Flag interface { fmt.Stringer } func TestCheckRequiredFlag(t *testing.T) { testdata := []struct { st []Flag }{ { st: []Flag{//allowed &StringFlag{Name: ""}, }, }, } st := struct { st Flag }{ st: Flag{// is not allowed &StringFlag{Name: ""}, }, } }
此複合文字使用給定值指派一個新的結構實例。
大括號 {}
用於切片、結構、陣列和映射的文字值。它們不用於介面值。如果您想要介面類型的文字值,則必須使用 ()
語法,該語法呼叫 “類型轉換”。
例如:
x := myinterface(&mystruct{})
x
的型別為 myinterface
。
要更正您的程式碼:
st := struct { st flag }{ st: flag( &stringflag{name: ""}, ), }
您也可以完全刪除類型轉換,因為 go 允許直接指派給介面值,且轉換是隱含的。更明確地說,可分配性規則說(為了清楚起見進行了編輯):
如果 t 是介面類型且 x 實作 t,則類型 v 的值 x 可指派給類型 t 的變數。
所以,這段程式碼也可以工作:
st := struct { st Flag }{ st: &StringFlag{Name: ""}, }
請注意,在切片、結構和映射等複合文字中,給定的值被視為分配到它們各自的索引、字段或鍵,就好像它們是變數一樣,因此可分配性規則申請。
以上是實例化介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!