Go語言學習之接口使用的示例詳解
正如前文提到,Go語言并沒有類的定義,接口可以說Go語言最接近于類的實現(xiàn)方式,但是更輕量。對于接口的學習,如果從原理層面理解學習起來比較慢,所以建議先從代碼使用維度進行理解,最終回歸到原理層面加深理解。
需求與分析
假設(shè)我們有一組圖形,需要計算每個圖形的面積,并計算他們的面積之和。那么最簡單的方法就是分別計算他們的面積,并進行相加,我們來嘗試實現(xiàn)一下。
不使用接口的實現(xiàn)
在這個代碼實現(xiàn)中,我們需要將兩種不同形狀,矩形(rect)和圓形(circle)的面積求和,因此我們定義了如下內(nèi)容:
- 兩個結(jié)構(gòu)體,矩形是長和寬,圓形是半徑
- 分別實現(xiàn)了兩個求面積的方法area(),矩形的面積等于長乘以寬,而圓形面積則是半徑的平方乘以Pi
- 在求和部分,我們直接定義了一個float64的數(shù)組,將面積直接存入該數(shù)組中
- 通過循環(huán)進行求和
雖然上述方式能夠滿足我們的需求,但是如果我們需要增加一個計算周長的方法時,我們的代碼會變得非常冗余并且可讀性變差,因此我們用接口嘗試來改造我們的代碼。
package main
import (
"fmt"
"math"
)
type rect struct {
width float64
height float64
}
func (r rect) area() float64 {
return r.width * r.height
}
type circle struct {
radius float64
}
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func main() {
var areaSum float64
// Intial circle and rect struct type
c1 := circle{2.5}
r1 := rect{3, 4}
// Save all area results into an array
shapeAreas := []float64{c1.area(), r1.area()}
// Sum all area together
areaSum = 0
for _, area := range shapeAreas {
areaSum += area
}
fmt.Printf("Sum area = %v\n", areaSum)
}
使用接口的實現(xiàn)
相較于上述代碼,我們做了如下優(yōu)化:
- 定義了一個新的interface shape,包含一個area()方法,即實現(xiàn)了area()的struct,就實現(xiàn)了shape接口
- 在結(jié)構(gòu)體定義,area()計算部分我們并沒有修改
- 在主函數(shù)中,我們重新定義了一個類型為shape interface的數(shù)組,該數(shù)組中無須再計算area(),只需要將兩個不通類型存放在該數(shù)組中
- 在循環(huán)過程中,我們直接調(diào)用每個shape interface中的area()方法,即可完成面積求和
package main
import (
"fmt"
"math"
)
// Define a new interface, contain a method define and type is float64
type shape interface {
area() float64
}
type rect struct {
width float64
height float64
}
func (r rect) area() float64 {
return r.width * r.height
}
type circle struct {
radius float64
}
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func main() {
var areaSum float64
// Intial circle and rect struct type
c1 := circle{2.5}
r1 := rect{3, 4}
// Previous: Save all area results into an array
// Previous: shapeAreas := []float64{c1.area(), r1.area()}
// Define an array with new shape interface
shapes := []shape{c1, r1}
// Previous: Sum all area together
areaSum = 0
// Previous: for _, area := range shapeAreas {
// Previous: areaSum += area
// Previous: }
// Implement a new loop
for _, shape := range shapes {
areaSum += shape.area()
}
fmt.Printf("Sum area = %v\n", areaSum)
}
接口作為函數(shù)參數(shù)
進一步優(yōu)化代碼,我們將接口作為參數(shù),在主函數(shù)中調(diào)用時,只需要傳入相應(yīng)類型就會自動根據(jù)類型調(diào)用相應(yīng)的計算面積的方法。
package main
import (
"fmt"
"math"
)
// Define a new interface, contain a method define and type is float64
type shape interface {
area() float64
}
type rect struct {
width float64
height float64
}
// NOTE: 接口類型為rect
func (r rect) area() float64 {
return r.width * r.height
}
type circle struct {
radius float64
}
// NOTE: 接口類型為circle
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func getArea(s shape) float64 {
return s.area()
}
func main() {
var areaSum float64
// Intial circle and rect struct type
c1 := circle{2.5}
r1 := rect{3, 4}
// Previous: Save all area results into an array
// Previous: shapeAreas := []float64{c1.area(), r1.area()}
// Define an array with new shape interface
shapes := []shape{c1, r1}
// Previous: Sum all area together
areaSum = 0
// Previous: for _, area := range shapeAreas {
// Previous: areaSum += area
// Previous: }
// Implement a new loop
for _, shape := range shapes {
areaSum += getArea(shape)
}
fmt.Printf("Sum area = %v\n", areaSum)
}
到此這篇關(guān)于Go語言學習之接口使用的示例詳解的文章就介紹到這了,更多相關(guān)Go語言接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言基于HTTP的內(nèi)存緩存服務(wù)的實現(xiàn)
這篇文章主要介紹了Go語言基于HTTP的內(nèi)存緩存服務(wù),本程序采用REST接口,支持設(shè)置(Set)、獲取(Get)和刪除(Del)這3個基本操作,同時還支持對緩存服務(wù)狀態(tài)進行查詢,需要的朋友可以參考下2022-08-08
基于golang的簡單分布式延時隊列服務(wù)的實現(xiàn)
這篇文章主要介紹了基于golang的簡單分布式延時隊列服務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體
這篇文章主要介紹了Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體,結(jié)構(gòu)體是包含多個字段的集合類型,用于將數(shù)據(jù)組合為記錄2022-07-07
gorm update傳入struct對象,零值字段不更新的解決方案
這篇文章主要介紹了gorm update傳入struct對象,零值字段不更新的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

