Go 分布式学习利器(10)-- Go语言的接口
生活随笔
收集整理的這篇文章主要介紹了
Go 分布式学习利器(10)-- Go语言的接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 接口與依賴
- 2. 自定義類型
1. 接口與依賴
在上一節中我們討論Go語言的面向對象特性的時候也說了,Go語言并不支持繼承,能夠進行對象的封裝(包括數據成員和成員函數的封裝),那么這里簡單說一下Go語言接口之間的依賴關系。
我們知道 C++中兩個接口之間的依賴 可以通過公有/私有繼承方式來實現,且有對應的標識關鍵字
class Programmar{
public:virtual std::string WriteHelloWorld()=0; // 純虛函數標識實現只能在子類進行
};class CxxProgrammar : public Programmar{ //標識公有繼承
public:std::string WriteHelloWorld();
};std::string CxxProgrammar::WriteHelloWorld(){std::cout << "Hello World!" << std::endl;return "Hello World!";
}
在Go語言中的 接口之間的依賴關系則相比于以上語言有一些差異,先看一個聲明的案例
type Programmer interface {WriteHelloWorld() string
}type GoProgrammer struct{ // 不需要顯式聲明接口
}func (p *GoProgrammer) WriteHelloWorld() string{ // 具體方法的實現,并綁定在GoProgrammer 的指針上return "fmt.Println(\"Hello World!\")"
}
以上Go語言的案例測試代碼如下:
package interface_testimport ("testing"
)type Programmer interface {WriteHelloWorld() string
}type GoProgrammer struct{ // 不需要顯示指定繼承實現
}func (p *GoProgrammer) WriteHelloWorld() string{ // 只需要方法簽名一樣,即可實例化父類的成員,不需要顯式聲明return "fmt.Println(\"Hello World!\")"
}func TestInterface(t *testing.T) {var p Programmer // 創建一個基類(C++的描述,Go語言中叫做interface)p = new(GoProgrammer) // 用派生類初始化該對象t.Log(p.WriteHelloWorld())
}
最終如上測試代碼的輸出:
=== RUN TestInterfaceinterface_test.go:25: fmt.Println("Hello World!")
--- PASS: TestInterface (0.00s)
綜上總結,Go語言的接口和其他語言的主要差異如下:
- 接口為非侵入性,實現不依賴于接口的定義
- 接口的定義可以包含在接口的使用者包內
同時Go 語言也提供了接口變量:
其中 Coder 表示是一個接口,GoProgrammar表示其實現。
2. 自定義類型
- 自定義一個函數類型:
type IntCov func(n int) int - 自定義一個普通類型:
type MyInt int
自定義類型,尤其是函數類型能夠一定程度降低代碼的復雜度,讓代碼更易讀。
如下,未添加自定義函數類型
// 計時函數 -- 計算一個函數的執行耗時
func calcTimeSpent(inner func(op int) int) func(op int) int{return func(n int) int{start := time.Now() // 開始計時ret := inner(n) // 執行函數fmt.Println("time spent :", time.Since(start).Seconds()) // 統計計時return ret}
}
可以看到函數定義部分很難區分函數的邏輯,而我們增加了自定義函數類型之后:
type IntCov func(op int) int // 自定義函數類型,簡化函數邏輯
func calcTimeSpent(inner IntCov) IntCov{return func(n int) int{start := time.Now() // 開始計時ret := inner(n) // 執行函數fmt.Println("time spent :", time.Since(start).Seconds()) // 統計計時return ret}
}
可以看到定義的函數開頭部分復雜度立即降低。
完成的 統計函數耗時測試代碼如下:
package interface_testimport ("testing""time""fmt"
)type IntCov func(op int) int // 自定義函數類型,簡化函數邏輯
func calcTimeSpent(inner IntCov) IntCov{return func(n int) int{start := time.Now() // 開始計時ret := inner(n) // 執行函數fmt.Println("time spent :", time.Since(start).Seconds()) // 統計計時return ret}
}func slowTest(op int) int {time.Sleep(time.Second * 1) // sleep 1秒return op
}func TestSpentTime(t *testing.T) {sp := calcTimeSpent(slowTest) // 傳入耗時函數t.Log(sp(10))
}
輸出如下:
=== RUN TestSpentTime
time spent : 1.000234077interface_test.go:47: 10
--- PASS: TestSpentTime (1.00s)
總結
以上是生活随笔為你收集整理的Go 分布式学习利器(10)-- Go语言的接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《春雪》第二句是什么
- 下一篇: 一文入门 Zookeeper