首頁  >  文章  >  後端開發  >  實例化介面

實例化介面

WBOY
WBOY轉載
2024-02-08 21:08:41403瀏覽

實例化介面

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除