婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何判斷Golang接口是否實現的操作

如何判斷Golang接口是否實現的操作

熱門標簽:地圖標注免費定制店 不封卡外呼系統 上海極信防封電銷卡價格 寧波語音外呼系統公司 宿遷便宜外呼系統代理商 仙桃400電話辦理 鄭州智能語音電銷機器人價格 湛江crm外呼系統排名 重慶慶云企業400電話到哪申請

前言

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

主要探討兩個問題:

1.利用編譯來判斷Golang接口是否實現

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

正文

1.利用編譯來判斷Golang接口是否實現

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

var _ Pooler = new(WeightedRoundRobin)

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

type Pooler interface {
  // ...
}

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

后面發現這個是為了驗證某某接口是否被實現了?

多看了一些代碼后發現很多地方有類似這樣的寫法。

至此Get到了。

解釋:如果說次接口沒有被實現,那么一方面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)
}

輸出:

[] [] [] true

附錄:Golang new和 make的區別

擴展

對于內存的占用,今天看到一種寫法。

var _ Tester = (*Test)(nil)

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

補充:Golang接口實現多態

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

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方法可以多態來實現。

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

您可能感興趣的文章:
  • 淺談Golang 嵌套 interface 的賦值問題
  • golang中的空接口使用詳解
  • golang接口IP限流,IP黑名單,IP白名單的實例
  • Golang 使用接口實現泛型的方法示例
  • golang分層測試之http接口測試入門教程
  • golang基礎之Interface接口的使用
  • golang 接口嵌套實現復用的操作

標簽:西雙版納 安康 電子產品 海南 青海 物業服務 遼寧 儋州

巨人網絡通訊聲明:本文標題《如何判斷Golang接口是否實現的操作》,本文關鍵詞  如何,判斷,Golang,接口,是否,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何判斷Golang接口是否實現的操作》相關的同類信息!
  • 本頁收集關于如何判斷Golang接口是否實現的操作的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 广丰县| 得荣县| 山阴县| 司法| 那曲县| 奉贤区| 麦盖提县| 盐源县| 屏边| 荔浦县| 西和县| 来凤县| 商南县| 云龙县| 阳新县| 蕲春县| 德令哈市| 嵩明县| 宝应县| 旌德县| 申扎县| 固安县| 南充市| 石城县| 巴南区| 栾城县| 祁门县| 镇坪县| 五峰| 屏东市| 绥中县| 晋中市| 海阳市| 高唐县| 阳信县| 昌黎县| 凌云县| 高青县| 日土县| 渑池县| 嘉峪关市|