Go 語言中的接口
在所有編程語言中,接口都是一些方法的集合,通常都是"類"們都需要實現的一些公共方法。使這些"類"在使用過程中多了一層抽象。在使用接口時無需在意這些方法是如何實現的,只需在意這個接口中的方法本身。Go 語言提倡面向接口編程,一來增強代碼的可讀性,二來可以使代碼的模塊之間的關系變得更加清晰、邊界更加明顯。本文就來介紹一下 Go 語言中的接口。
1. 接口定義
在 Go 語言中,接口也是一個數據類型,該類型使用結構?interface{...}
?來定義。
代碼示例:
代碼塊
- 1?
var stuInterface interface{
- 2? ? ? ?
PrintAge()
- 3?
}
以上代碼定義可一個接口類型的變量,其中包含的方法為 PrintAge()。
2. 接口實現
了解了 Go 語言中接口的定義之后,我們來學習一下如何實現Go語言的接口。
在 Go 語言的接口中有兩個非常重要的特性:
- 只要有類實現(模擬)了接口中包含的所有方法,我們就稱這個類型實現了這個接口;
- 只要是實現了這個接口的類型,用這個類型定義的變量就可以給這個接口聲明的變量賦值。
所以從以上兩個特性也可以推出?interface{}?類型的變量,可以接收?任何變量的賦值。這兩個特性也被稱為鴨子類型,即"走起來像鴨子,叫起來像鴨子(類型模擬了接口中包含的所有方法),那么它就是一只鴨子"。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ? ?
"fmt"
- 5?
)
- 6
- 7?
var stuInterface interface {
- 8? ? ? ? ? ?
PrintAge()
- 9?
}
- 10
- 11?
type Student struct {
- 12? ? ? ? ?
Name string
- 13? ? ? ? ?
Age int
- 14?
}
- 15
- 16?
func (s Student) PrintAge() {
- 17? ? ? ? ?
fmt.Println(s.Age)
- 18?
}
- 19
- 20?
func main() {
- 21? ? ? ? ?
stuInterface = Student{
- 22? ? ? ? ? ? ? ? ? ?
Name: "Codey",
- 23? ? ? ? ? ? ? ? ? ?
Age: 18,
- 24? ? ? ? ?
}
- 25? ? ? ? ?
stuInterface.PrintAge()
- 26?
}
- 第 21~24 行:定義了一個自定義類型,并且這個類型實現了接口變量類型中的方法;
- 第 21 行:實例化一個自定義類型的變量,并賦值給這個接口變量;
- 第 25 行:使用接口中的方法。會發現打印了學生的年齡。
執行結果:
3. 自定義接口類型
為了方便使用,一般都會使用自定義類型來定義一個接口類型。同時還可以寫一個函數來實例化接口。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ? ?
"fmt"
- 5?
)
- 6
- 7?
type StudentInterface interface {
- 8? ? ? ? ? ?
PrintAge()
- 9?
}
- 10
- 11?
type Student struct {
- 12? ? ? ? ?
Name string
- 13? ? ? ? ?
Age int
- 14?
}
- 15
- 16?
func (s Student) PrintAge() {
- 17? ? ? ? ?
fmt.Println(s.Age)
- 18?
}
- 19
- 20?
func newStudent(name string, age int) StudentInterface {
- 21? ? ? ? ?
return Student{Name: name, Age: age}
- 22?
}
- 23?
func main() {
- 24? ? ? ? ?
stuInterface := newStudent("Codey", 18)
- 25
- 26? ? ? ? ?
stuInterface.PrintAge()
- 27?
}
- 第 20~22 行:定義一個函數來實例化接口;
- 第 24 行:初始化一個接口變量。
執行結果:
4. 小結
本文主要介紹了 Go 語言中接口的定義和使用。需要注意以下幾點:
- 在 Go 語言中接口是一個類型;
- 一般使用自定義類型來定義接口;
- Go 語言的接口是鴨子類型。
文章來源于網絡,侵刪!