首頁  >  文章  >  後端開發  >  我如何不再擔心並學會熱愛 Go 介面

我如何不再擔心並學會熱愛 Go 介面

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-24 08:19:29171瀏覽

嘿,Go 新手們(或者我應該說 Gophers-in-training?)! ?
介面似乎是每個人都在談論的神秘而神奇的事物之一,但沒有人真正以有意義的方式進行解釋。 「這就像多態性,但更簡單,」他們說。 「這就像一份合同,」他們聲稱。但每次我嘗試實現一個時,我的代碼都會看著我,“你在做什麼,人類?” ?

但那是那時。現在,介面和我的關係好多了,我來這裡是為了幫助您避免我早期的困惑。所以,如果你一直對 Go 接口摸不著頭腦,那就喝杯咖啡(或茶),讓我們一步一步地分解它——消除頭痛。 ?
那麼,介面到底是什麼?

讓我們從最頂層開始。在 Go 中,介面基本上是一種定義行為的方式,但不會被其工作細節所困擾。想像一下,你是一家工廠的老闆,你並不關心機器是如何運作的;你只在乎它能生產出產品。這就是 Go 介面的樣子:您定義需要發生什麼,但不定義應該如何完成。

例如,假設我們正在與動物一起工作(是的,Go 與動物一起工作,請留在這兒)。你知道每種動物都會發出聲音,但你並不真正在乎它是如何發生的。狗吠,貓喵喵,還有鴨子……嗯,它們嘎嘎叫。你可以像這樣定義一個介面:

type Animal interface {
    Sound() string
}

How I Stopped Worrying and Learned to Love Go Interfaces
這是什麼?只是一個契約,上面寫著:「嘿,任何想要被稱為 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!
}

這裡發生了什麼事?

  1. 我們定義了一個 Animal 接口,它有一個方法:Sound() ?.
  2. 然後我們建立兩種類型,Dog 和 Cat,並賦予它們獨特的 Sound() 方法。
  3. 在 main() 函數中,我們建立一個變數 myPet,它可以容納任何滿足 Animal 介面的東西。
  4. 首先,我們分配一隻狗,然後繁榮!我們的狗叫起來:「汪!」?
  5. 然後我們分配一隻貓,你猜怎麼著?它喵喵叫: “喵!” ?

這就是 Go 介面的魔力真正發揮作用的地方 ??:
只要類型具有所需的方法,它就滿足介面。無需明確地說「Dog 實現了 Animal」——Go 足夠聰明,可以自己解決這個問題! ??

為什麼要關心介面?

How I Stopped Worrying and Learned to Love Go Interfaces
讓我跟你說實話。起初,我想,「為什麼還要麻煩這個呢?我可以直接寫我的方法!」但相信我,您會希望盡快了解接口,尤其是當您的程式碼庫開始增長時。

原因如下:

  1. 靈活性:介面讓您的程式碼更加靈活。只要滿足接口,您就可以將一種類型替換為另一種類型。這就像根據某人的技能而不是職位來僱用某人一樣。
  2. 多態性:如果不同類型實現相同的接口,則可以統一對待它們。這就是為什麼介面如此強大的原因——就像擁有一個適用於任何電視的通用遙控器。

  3. 乾淨的程式碼:介面可讓您編寫更乾淨、更模組化的程式碼。您定義行為並讓類型處理自己的實作。

多種方法,沒問題!

讓我們更上一層樓。假設您正在建立一個處理形狀的系統,並且您想要計算圓形和矩形等不同形狀的面積和周長。進入多方法介面!

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 的介面魔力在你身上成長。不久之後,您將編寫出像技術會議上的瑜珈教練一樣乾淨靈活的程式碼。

地鼠同胞們,編碼愉快!願您的介面簡單,並且您的結構能夠不斷實現。 ?✌️

How I Stopped Worrying and Learned to Love Go Interfaces

以上是我如何不再擔心並學會熱愛 Go 介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn