嘿,Go 新手們(或者我應該說 Gophers-in-training?)! ?
介面似乎是每個人都在談論的神秘而神奇的事物之一,但沒有人真正以有意義的方式進行解釋。 「這就像多態性,但更簡單,」他們說。 「這就像一份合同,」他們聲稱。但每次我嘗試實現一個時,我的代碼都會看著我,“你在做什麼,人類?” ?
但那是那時。現在,介面和我的關係好多了,我來這裡是為了幫助您避免我早期的困惑。所以,如果你一直對 Go 接口摸不著頭腦,那就喝杯咖啡(或茶),讓我們一步一步地分解它——消除頭痛。 ?
那麼,介面到底是什麼?
讓我們從最頂層開始。在 Go 中,介面基本上是一種定義行為的方式,但不會被其工作細節所困擾。想像一下,你是一家工廠的老闆,你並不關心機器是如何運作的;你只在乎它能生產出產品。這就是 Go 介面的樣子:您定義需要發生什麼,但不定義應該如何完成。
例如,假設我們正在與動物一起工作(是的,Go 與動物一起工作,請留在這兒)。你知道每種動物都會發出聲音,但你並不真正在乎它是如何發生的。狗吠,貓喵喵,還有鴨子……嗯,它們嘎嘎叫。你可以像這樣定義一個介面:
type Animal interface { Sound() string }
這是什麼?只是一個契約,上面寫著:「嘿,任何想要被稱為 Animal 的類型都必須有一個 Sound() 方法。」就是這樣!不涉及任何奇怪的巫術。
給我看程式碼! ???
讓我們舉一個超級簡單的例子,看看它是如何運作的。我們將創造一些動物並讓它們說話。
package main import "fmt" // The Animal interface type Animal interface { Sound() string } // Define a Dog type Dog struct{} func (d Dog) Sound() string { return "Woof!" } // Define a Cat type Cat struct{} func (c Cat) Sound() string { return "Meow!" } func main() { // Our Animal variable can hold any type that satisfies the interface var myPet Animal // myPet is now a Dog myPet = Dog{} fmt.Println(myPet.Sound()) // Outputs: Woof! // myPet is now a Cat myPet = Cat{} fmt.Println(myPet.Sound()) // Outputs: Meow! }
這裡發生了什麼事?
這就是 Go 介面的魔力真正發揮作用的地方 ??:
只要類型具有所需的方法,它就滿足介面。無需明確地說「Dog 實現了 Animal」——Go 足夠聰明,可以自己解決這個問題! ??
為什麼要關心介面?
讓我跟你說實話。起初,我想,「為什麼還要麻煩這個呢?我可以直接寫我的方法!」但相信我,您會希望盡快了解接口,尤其是當您的程式碼庫開始增長時。
原因如下:
多態性:如果不同類型實現相同的接口,則可以統一對待它們。這就是為什麼介面如此強大的原因——就像擁有一個適用於任何電視的通用遙控器。
乾淨的程式碼:介面可讓您編寫更乾淨、更模組化的程式碼。您定義行為並讓類型處理自己的實作。
多種方法,沒問題!
讓我們更上一層樓。假設您正在建立一個處理形狀的系統,並且您想要計算圓形和矩形等不同形狀的面積和周長。進入多方法介面!
type Animal interface { Sound() string }
空介面(介面{})
哦,你以為我們就完了? ? ?沒有!讓我們更深入地了解一下空接口,interface{},這是 Go 表達「我可以容納任何類型」的方式。它就像一個免費的盒子,你可以在其中放入任何東西——字串、數字、結構——只要你能想到的。
package main import "fmt" // The Animal interface type Animal interface { Sound() string } // Define a Dog type Dog struct{} func (d Dog) Sound() string { return "Woof!" } // Define a Cat type Cat struct{} func (c Cat) Sound() string { return "Meow!" } func main() { // Our Animal variable can hold any type that satisfies the interface var myPet Animal // myPet is now a Dog myPet = Dog{} fmt.Println(myPet.Sound()) // Outputs: Woof! // myPet is now a Cat myPet = Cat{} fmt.Println(myPet.Sound()) // Outputs: Meow! }
空介面通常用於您事先不知道要處理哪種類型的情況(例如 API 或函式庫)。這就像 Go 版本的通配符。
擁抱介面
學習 Go 介面一開始感覺就像在迷宮中行走,但是一旦掌握了基礎知識,它就會打開一個靈活、可重用且乾淨的程式碼的全新世界。所以不要害怕投入其中!
從簡單開始,玩一些小例子,讓 Go 的介面魔力在你身上成長。不久之後,您將編寫出像技術會議上的瑜珈教練一樣乾淨靈活的程式碼。
地鼠同胞們,編碼愉快!願您的介面簡單,並且您的結構能夠不斷實現。 ?✌️
以上是我如何不再擔心並學會熱愛 Go 介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!