日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 分布式学习利器(10)-- Go语言的接口

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言的接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。