Golang學習——如何判斷Golang接口是否實現?

前言

在看一個底層庫的的時候,看到了一個比較奇怪的寫法,因而乎有了本文。程序員

主要探討兩個問題:web

1.利用編譯來判斷Golang接口是否實現
2.延伸出的make和new的區別編輯器

正文

1.利用new()來判斷Golang接口是否實現

看了一個底層通用連接池的庫,有這麼一行代碼:ide

var _ Pooler = new(WeightedRoundRobin)
複製代碼

須要解釋的是:Pooler是一個接口類型。ui

type Pooler interface {
    // ...
}
複製代碼

剛開始看是疑惑的,爲何new了以後是要拋棄調?url

後面發現這個是爲了驗證某某接口是否被實現了?spa

多看了一些代碼後發現不少地方有相似這樣的寫法。.net

至此Get到了。3d

解釋:若是說次接口沒有被實現,那麼一方面ide會有紅橫線出現,另外一方面在編譯的時候會出現報錯。兩方面的提示來保證寫底層代碼的接口是有被實現的。指針

2.延伸出的make和new的區別

和小夥伴討論期間,跑出了這麼一個問題:「可使用go test的方式,去_test.go文件中定義一個接口,來判斷就行了。上文判斷會存在浪費內存的狀況

這邊兩個點:
1.go test的方式確定是可行的。
可是並無法保證程序員會真的記住去執行進行檢測(非強制必須走的流程)。可是直接經過前文方式,是會在編譯的時候拋錯的,這個是必須走的流程,因此更推薦前文的方式。

2.new佔內存?
new:申請了內存,可是不會將內存初始化,只會將內存置零,返回一個指針。

make:申請了內存,返回已初始化的結構體的零值。
在這裏插入圖片描述
回到正文,雖然申請了內存,但佔的內存其實並很少,而且在初始化後的一次gc中便會回收。因此還好。
同時也不存在效率問題,編譯型語言,你懂的。

同時驗證一個new和取地址和make的區別的代碼:

func main() {
 a1 := new([]int)
 a2:= &[]int{}
 a3:= make([]int,0)
 fmt.Println(a1,a2,a3,a1==a1) } 複製代碼

附錄:Golang new和 make的區別

擴展
對於內存的佔用,今天看到一種寫法。

var _ Tester = (*Test)(nil)
複製代碼

這樣寫和new的區別在於:new是編譯的時候檢查,這樣寫是運行的時候檢查

轉載自:如何判斷Golang接口是否實現?

本文使用 mdnice 排版

相關文章
相關標籤/搜索