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