1. 程式人生 > GO語言入門 >32 Go 語言中的介面

32 Go 語言中的介面

在所有程式語言中,介面都是一些方法的集合,通常都是"類"們都需要實現的一些公共方法。使這些"類"在使用過程中多了一層抽象。在使用介面時無需在意這些方法是如何實現的,只需在意這個介面中的方法本身。Go 語言提倡面向介面程式設計,一來增強程式碼的可讀性,二來可以使程式碼的模組之間的關係變得更加清晰、邊界更加明顯。本文就來介紹一下 Go 語言中的介面。

1. 介面定義

在 Go 語言中,介面也是一個數據型別,該型別使用結構 interface{...} 來定義。

程式碼示例:

var stuInterface interface{
    PrintAge()
}

以上程式碼定義可一個介面型別的變數,其中包含的方法為 PrintAge()。

2. 介面實現

瞭解了 Go 語言中介面的定義之後,我們來學習一下如何實現Go語言的介面。

在 Go 語言的介面中有兩個非常重要的特性:

  • 只要有類實現(模擬)了介面中包含的所有方法,我們就稱這個型別實現了這個介面
  • 只要是實現了這個介面的型別,用這個型別定義的變數就可以給這個介面宣告的變數賦值

所以從以上兩個特性也可以推出 interface{} 型別的變數,可以接收 任何變數的賦值。這兩個特性也被稱為鴨子型別,即"走起來像鴨子,叫起來像鴨子(型別模擬了介面中包含的所有方法),那麼它就是一隻鴨子"。

程式碼示例:

package main

import (
    "fmt"
)

var
stuInterface interface { PrintAge() } type Student struct { Name string Age int } func (s Student) PrintAge() { fmt.Println(s.Age) } func main() { stuInterface = Student{ Name: "Codey", Age: 18, } stuInterface.PrintAge() }
  • 第 21~24 行:定義了一個自定義型別,並且這個型別實現了介面變數型別中的方法;
  • 第 21 行:例項化一個自定義型別的變數,並賦值給這個介面變數;
  • 第 25 行:使用介面中的方法。會發現列印了學生的年齡。

執行結果:

圖片描述

3. 自定義介面型別

為了方便使用,一般都會使用自定義型別來定義一個介面型別。同時還可以寫一個函式來例項化介面。

程式碼示例:

package main

import (
    "fmt"
)

type StudentInterface interface {
    PrintAge()
}

type Student struct {
    Name string
    Age  int
}

func (s Student) PrintAge() {
    fmt.Println(s.Age)
}

func newStudent(name string, age int) StudentInterface {
    return Student{Name: name, Age: age}
}
func main() {
    stuInterface := newStudent("Codey", 18)

    stuInterface.PrintAge()
}
  • 第 20~22 行:定義一個函式來例項化介面;
  • 第 24 行:初始化一個介面變數。

執行結果:

圖片描述

4. 小結

本文主要介紹了 Go 語言中介面的定義和使用。需要注意以下幾點:

  • 在 Go 語言中介面是一個型別;
  • 一般使用自定義型別來定義介面;
  • Go 語言的介面是鴨子型別