在 Go 中,介面通常用於定義功能而不是資料。這意味著,雖然您可以在介面中指定方法,但無法在實作中指定任何必需欄位。
但是,使用嵌入式結構,可以建立透過方法公開資料來有效定義資料的介面。
考慮以下範例:
type PersonProvider interface { GetPerson() *Person } type Person struct { Name string Age int64 } func (p *Person) GetPerson() *Person { return p } type Bob struct { FavoriteNumber int64 Person }
在此例如,PersonProvider 介面定義了一個傳回指向 Person 物件的指標的方法。 Person 結構包含資料欄位 Name 和 Age。 Bob 結構體嵌入了 Person 結構體,有效地繼承了它的欄位。
函數可以透過GetPerson() 方法與嵌入的資料互動:
func SayHi(pp PersonProvider) { fmt.Printf("Hello, %v!\r", pp.GetPerson().Name) } func main() { b := &Bob{ 5, Person{"Bob", 23}, } SayHi(b) fmt.Printf("You're %v years old now!", b.Age) }
這種技術允許定義資料而不是定義資料的介面行為。它允許結構體實現介面而不暴露其特定字段,從而提供了更高的靈活性。但是,需要注意的是,公開指針仍然可以直接存取數據,從而提供了有限的額外靈活性。
此外,Go 約定並不總是需要使用抽象來進行資料存取。在許多情況下,透過嵌入或公共欄位公開資料屬性是可以接受的。在考慮此技術時,建議根據具體情況評估它是否比直接公開屬性具有顯著優勢。如果透過 getter 和 setter 公開資料對於未來的靈活性或 API 相容性並不重要,那麼公共屬性可能是更簡單的解決方案。
整體而言,雖然所提出的技術是一個聰明的技巧,但建議權衡其需求仔細考慮並考慮在某些情況下可能更合適的替代方法。
以上是您應該使用嵌入式結構來定義 Go 介面中的資料嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!