最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何判斷Golang接口是否實(shí)現(xiàn)的操作

 更新時(shí)間:2020年12月23日 11:46:34   作者:咖啡色的羊駝  
這篇文章主要介紹了如何判斷Golang接口是否實(shí)現(xiàn)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

前言

在看一個(gè)底層庫的的時(shí)候,看到了一個(gè)比較奇怪的寫法,于是乎有了本文。

主要探討兩個(gè)問題:

1.利用編譯來判斷Golang接口是否實(shí)現(xiàn)

2.延伸出的make和new的區(qū)別

正文

1.利用編譯來判斷Golang接口是否實(shí)現(xiàn)

看了一個(gè)底層通用鏈接池的庫,有這么一行代碼:

var _ Pooler = new(WeightedRoundRobin)

需要解釋的是:Pooler是一個(gè)接口類型。

type Pooler interface {
  // ...
}

剛開始看是疑惑的,為什么new了之后是要拋棄調(diào)?

后面發(fā)現(xiàn)這個(gè)是為了驗(yàn)證某某接口是否被實(shí)現(xiàn)了?

多看了一些代碼后發(fā)現(xiàn)很多地方有類似這樣的寫法。

至此Get到了。

解釋:如果說次接口沒有被實(shí)現(xiàn),那么一方面ide會有紅橫線出現(xiàn),另一方面在編譯的時(shí)候會出現(xiàn)報(bào)錯。兩方面的提示來保證寫底層代碼的接口是有被實(shí)現(xiàn)的。

2.延伸出的make和new的區(qū)別

和小伙伴討論期間,跑出了這么一個(gè)問題:“可以使用go test的方式,去_test.go文件中定義一個(gè)接口,來判斷就好了。上文判斷會存在浪費(fèi)內(nèi)存的情況”

這邊兩個(gè)點(diǎn):

1.go test的方式肯定是可行的。

但是并沒法保證程序員會真的記住去執(zhí)行進(jìn)行檢測(非強(qiáng)制必須走的流程)。但是直接通過前文方式,是會在編譯的時(shí)候拋錯的,這個(gè)是必須走的流程,所以更推薦前文的方式。

2.new占內(nèi)存?

new:申請了內(nèi)存,但是不會將內(nèi)存初始化,只會將內(nèi)存置零,返回一個(gè)指針。

make:申請了內(nèi)存,返回已初始化的結(jié)構(gòu)體的零值。

回到正文,雖然申請了內(nèi)存,但占的內(nèi)存其實(shí)并不多,并且在初始化后的一次gc中便會回收。所以還好。

同時(shí)也不存在效率問題,編譯型語言,你懂的。

同時(shí)驗(yàn)證一個(gè)new和取地址和make的區(qū)別的代碼:

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

輸出:

&[] &[] [] true

附錄:Golang new和 make的區(qū)別

擴(kuò)展

對于內(nèi)存的占用,今天看到一種寫法。

var _ Tester = (*Test)(nil)

這樣寫和new的區(qū)別在于:new是編譯的時(shí)候檢查,這樣寫是運(yùn)行的時(shí)候檢查

補(bǔ)充:Golang接口實(shí)現(xiàn)多態(tài)

我就廢話不多說了,大家還是直接看代碼吧~

package main 
import (
  "fmt"
)
 
func main() {
  user := &User{name: "Chris"}
  user.ISubUser = &NormalUser{}
  user.sayHi()
  user.ISubUser = &ArtisticUser{}
  user.sayHi()
}
 
type ISubUser interface {
  sayType()
}
 
type User struct {
  name string
  ISubUser
}
 
func (u *User) sayHi() {
  u.sayName()
  u.sayType()
}
 
func (u *User) sayName() {
  fmt.Printf("I am %s.", u.name)
}
 
type NormalUser struct {
 
}
 
func (n *NormalUser) sayType() {
  fmt.Println("I am a normal user.")
}
 
type ArtisticUser struct {
 
}
 
func (a *ArtisticUser) sayType() {
  fmt.Println("I am an artistic user.")
}
//RUN 之后輸出:
I am Chris.I am a normal user.
I am Chris.I am a artistic user.
//重用了sayName和sayHi方法,sayType方法可以多態(tài)來實(shí)現(xiàn)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go語言實(shí)現(xiàn)支付寶支付與退款詳解

    Go語言實(shí)現(xiàn)支付寶支付與退款詳解

    本文詳細(xì)介紹使用Go語言對接支付寶支付與退款功能的步驟和注意事項(xiàng),包括PC端、WAP端和Android端支付實(shí)現(xiàn),以及退款功能的代碼實(shí)現(xiàn),介紹了GoPay庫的使用,幫助開發(fā)者快速集成支付寶支付到應(yīng)用中
    2024-10-10
  • golang?gorm開發(fā)架構(gòu)及寫插件示例

    golang?gorm開發(fā)架構(gòu)及寫插件示例

    這篇文章主要為大家介紹了golang?gorm開發(fā)架構(gòu)及寫插件的詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go+redis實(shí)現(xiàn)消息隊(duì)列發(fā)布與訂閱的詳細(xì)過程

    go+redis實(shí)現(xiàn)消息隊(duì)列發(fā)布與訂閱的詳細(xì)過程

    這篇文章主要介紹了go+redis實(shí)現(xiàn)消息隊(duì)列發(fā)布與訂閱,redis做消息隊(duì)列的缺點(diǎn):沒有持久化,一旦消息沒有人消費(fèi),積累到一定程度后就會丟失,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Golang設(shè)計(jì)模式之適配器模式介紹和代碼示例

    Golang設(shè)計(jì)模式之適配器模式介紹和代碼示例

    適配器是一種結(jié)構(gòu)型設(shè)計(jì)模式, 它能使不兼容的對象能夠相互合作,可擔(dān)任兩個(gè)對象間的封裝器, 它會接收對于一個(gè)對象的調(diào)用, 并將其轉(zhuǎn)換為另一個(gè)對象可識別的格式和接口,本文將通過代碼示例詳細(xì)給大家介紹Golang的適配器模式
    2023-06-06
  • Go引用github包的詳細(xì)流程步驟

    Go引用github包的詳細(xì)流程步驟

    這篇文章主要給大家介紹了關(guān)于Go引用github包的詳細(xì)流程步驟,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Go具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-02-02
  • go modules中replace使用方法

    go modules中replace使用方法

    這篇文章主要為大家介紹了go modules中replace使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀

    go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀

    這篇文章主要為大家介紹了go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang使用tail實(shí)現(xiàn)追蹤文件變更

    golang使用tail實(shí)現(xiàn)追蹤文件變更

    這篇文章主要為大家介紹了golang如何借助 github.com/hpcloud/tail ,實(shí)現(xiàn)實(shí)時(shí)追蹤文件變更,達(dá)到類似shell命令tail -f的效果,感興趣的小伙伴可以了解一下
    2023-08-08
  • 使用Go重試機(jī)制代碼更可靠

    使用Go重試機(jī)制代碼更可靠

    這篇文章主要為大家介紹了使用Go重試機(jī)制的使用,使你的代碼更加可靠,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go中實(shí)現(xiàn)字符切片和字符串互轉(zhuǎn)

    go中實(shí)現(xiàn)字符切片和字符串互轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了go語言中如何實(shí)現(xiàn)字符切片和字符串互轉(zhuǎn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-11-11

最新評論

临西县| 龙门县| 富平县| 珲春市| 南雄市| 巫溪县| 商洛市| 南丰县| 舞钢市| 夏津县| 桃源县| 襄樊市| 汶上县| 常山县| 盐津县| 丹巴县| 平顺县| 珠海市| 廊坊市| 宕昌县| 泸定县| 库伦旗| 山阳县| 介休市| 余江县| 太谷县| 福清市| 搜索| 六枝特区| 潍坊市| 自贡市| 普洱| 韶关市| 宣威市| 云林县| 慈利县| 金阳县| 香格里拉县| 无棣县| 托克逊县| 吉水县|