欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

主要探討兩個問題:

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

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

正文

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

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

var _ Pooler = new(WeightedRoundRobin)

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

type Pooler interface {
  // ...
}

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

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

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

至此Get到了。

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

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

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

這邊兩個點:

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

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

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

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

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

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

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

同時驗證一個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ū)別

擴展

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

var _ Tester = (*Test)(nil)

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

補充:Golang接口實現(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)來實現(xiàn)。

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

相關(guān)文章

  • Go語言中JSON文件的讀寫操作

    Go語言中JSON文件的讀寫操作

    本文主要介紹了Go語言JSON文件的讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-04-04
  • Golang使用Gin框架實現(xiàn)http分塊傳輸

    Golang使用Gin框架實現(xiàn)http分塊傳輸

    這篇文章主要為大家詳細介紹了Golang中如何使用Gin框架實現(xiàn)http分塊傳輸功能,文中的示例代碼講解詳細,具有一定的學(xué)習價值,需要的可以參考一下
    2023-05-05
  • golang goroutine順序輸出方式

    golang goroutine順序輸出方式

    這篇文章主要介紹了golang goroutine順序輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言sync.Map詳解及使用場景

    Go語言sync.Map詳解及使用場景

    Go語言中的sync.Map是一個高效的并發(fā)安全映射結(jié)構(gòu),適用于高并發(fā)讀多寫少的場景,它通過讀寫分離、無鎖讀取路徑、寫入時的鎖保護等機制,提高了讀取性能并減少了鎖競爭,sync.Map不需要手動管理鎖,降低了編程復(fù)雜性,適合需要簡單并發(fā)訪問的場合
    2024-10-10
  • golang切片原理詳細解析

    golang切片原理詳細解析

    這篇文章主要介紹了golang切片原理詳細解析,切片在編譯時定義為Slice結(jié)構(gòu)體,并通過NewSlice()函數(shù)進行創(chuàng)建,更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-06-06
  • 使用golang實現(xiàn)一個MapReduce的示例代碼

    使用golang實現(xiàn)一個MapReduce的示例代碼

    這篇文章主要給大家介紹了關(guān)于如何使用golang實現(xiàn)一個MapReduce,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-09-09
  • Go語言中使用 buffered channel 實現(xiàn)線程安全的 pool

    Go語言中使用 buffered channel 實現(xiàn)線程安全的 pool

    這篇文章主要介紹了Go語言中使用 buffered channel 實現(xiàn)線程安全的 pool,因為Go語言自帶的sync.Pool并不是很好用,所以自己實現(xiàn)了一線程安全的 pool,需要的朋友可以參考下
    2014-10-10
  • Go語言中的sync包同步原語最新詳解

    Go語言中的sync包同步原語最新詳解

    Go語言在sync包中提供了一套多才多藝的同步機制,以及用于管理對共享資源的并發(fā)訪問的原子操作,了解這些工具并為您的并發(fā)需求選擇合適的工具是編寫高效可靠的并發(fā)Go程序的關(guān)鍵,這篇文章主要介紹了Go語言中的`sync`包同步原語,需要的朋友可以參考下
    2023-12-12
  • 使用Go語言編寫一個極簡版的容器Container

    使用Go語言編寫一個極簡版的容器Container

    Docker作為一種流行的容器化技術(shù),對于每一個程序開發(fā)者而言都具有重要性和必要性,因為容器化相關(guān)技術(shù)的普及大大簡化了開發(fā)環(huán)境配置、更好的隔離性和更高的安全性,對于部署項目和團隊協(xié)作而言也更加方便,本文將嘗試使用Go語言編寫一個極簡版的容器
    2023-10-10
  • Go外部依賴包從vendor,$GOPATH和$GOPATH/pkg/mod查找順序

    Go外部依賴包從vendor,$GOPATH和$GOPATH/pkg/mod查找順序

    這篇文章主要介紹了Go外部依賴包vendor,$GOPATH和$GOPATH/pkg/mod下查找順序,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論