成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > golang中interface接口的深度解析

golang中interface接口的深度解析

熱門標簽:黃岡人工智能電銷機器人哪個好 惠州電銷防封電話卡 建造者2地圖標注 阿里云ai電話機器人 鄭州亮點科技用的什么外呼系統(tǒng) 汕頭小型外呼系統(tǒng) 釘釘有地圖標注功能嗎 濱州自動電銷機器人排名 浙江高頻外呼系統(tǒng)多少錢一個月

一 接口介紹

如果說gorountine和channel是支撐起Go語言的并發(fā)模型的基石,讓Go語言在如今集群化與多核化的時代成為一道亮麗的風景,那么接口是Go語言整個類型系列的基石,讓Go語言在基礎(chǔ)編程哲學的探索上達到前所未有的高度。Go語言在編程哲學上是變革派,而不是改良派。這不是因為Go語言有g(shù)orountine和channel,而更重要的是因為Go語言的類型系統(tǒng),更是因為Go語言的接口。Go語言的編程哲學因為有接口而趨于完美。C++,Java 使用"侵入式"接口,主要表現(xiàn)在實現(xiàn)類需要明確聲明自己實現(xiàn)了某個接口。這種強制性的接口繼承方式是面向?qū)ο缶幊趟枷氚l(fā)展過程中一個遭受相當多質(zhì)疑的特性。Go語言采用的是“非侵入式接口",Go語言的接口有其獨到之處:只要類型T的公開方法完全滿足接口I的要求,就可以把類型T的對象用在需要接口I的地方,所謂類型T的公開方法完全滿足接口I的要求,也即是類型T實現(xiàn)了接口I所規(guī)定的一組成員。這種做法的學名叫做Structural Typing,有人也把它看作是一種靜態(tài)的Duck Typing。
    

要這個值實現(xiàn)了接口的方法。

type Reader interface { 
 Read(p []byte) (n int, err os.Error) 
} 
 
// Writer 是包裹了基礎(chǔ) Write 方法的接口。 
type Writer interface { 
 Write(p []byte) (n int, err os.Error) 
} 
 
var r io.Reader 
r = os.Stdin 
r = bufio.NewReader(r) 
r = new(bytes.Buffer) 

有一個事情是一定要明確的,不論 r 保存了什么值,r 的類型總是 io.Reader ,Go 是靜態(tài)類型,而 r 的靜態(tài)類型是 io.Reader。接口類型的一個極端重要的例子是空接口interface{},它表示空的方法集合,由于任何值都有零個或者多個方法,所以任何值都可以滿足它。也有人說 Go 的接口是動態(tài)類型的,不過這是一種誤解。 它們是靜態(tài)類型的:接口類型的變量總是有著相同的靜態(tài)類型,這個值總是滿足空接口,只是存儲在接口變量中的值運行時可能被改變。對于所有這些都必須嚴謹?shù)膶Υ驗榉瓷浜徒涌诿芮邢嚓P(guān)。

二  接口類型內(nèi)存布局

在類型中有一個重要的類別就是接口類型,表達了固定的一個方法集合。一個接口變量可以存儲任意實際值(非接口),只要這個值實現(xiàn)了接口的方法。interface在內(nèi)存上實際由兩個成員組成,如下圖,tab指向虛表,data則指向?qū)嶋H引用的數(shù)據(jù)。虛表描繪了實際的類型信息及該接口所需要的方法集。

type Stringer interface { 
 String() string 
} 
 
type Binary uint64 
 
func (i Binary) String() string { 
 return strconv.FormatUint(i.Get(), 2) 
} 
 
func (i Binary) Get() uint64 { 
 return uint64(i) 
} 
 
func main() { 
 var b Binary = 32 
 s := Stringer(b) 
 fmt.Print(s.String()) 
} 

  

觀察itable的結(jié)構(gòu),首先是描述type信息的一些元數(shù)據(jù),然后是滿足Stringger接口的函數(shù)指針列表(注意,這里不是實際類型Binary的函數(shù)指針集哦)。因此我們?nèi)绻ㄟ^接口進行函數(shù)調(diào)用,實際的操作其實就是s.tab->fun[0](s.data) 。是不是和C++的虛表很像?但是他們有本質(zhì)的區(qū)別。先看C++,它為每個類創(chuàng)建了一個方法集即虛表,當子類重寫父類的虛函數(shù)時,就將表中的相應(yīng)函數(shù)指針改為子類自己實現(xiàn)的函數(shù),如果沒有則指向父類的實現(xiàn),當面臨多繼承時,C++對象結(jié)構(gòu)里就會存在多個虛表指針,每個虛表指針指向該方法集的不同部分。我們再來看golang的實現(xiàn)方式,同C++一樣,golang也為每種類型創(chuàng)建了一個方法集,不同的是接口的虛表是在運行時專門生成的,而c++的虛表是在編譯時生成的(但是c++虛函數(shù)表表現(xiàn)出的多態(tài)是在運行時決定的).例如,當例子中當首次遇見s := Stringer(b)這樣的語句時,golang會生成Stringer接口對應(yīng)于Binary類型的虛表,并將其緩存。那么為什么go不采用c++的方式來實現(xiàn)呢?這根c++和golang的對象內(nèi)存布局是有關(guān)系的。

首先c++的動態(tài)多態(tài)是以繼承為基礎(chǔ)的,在對象構(gòu)造初始化的時首先會初始化父類,其次是子類,也就是說一個對象的內(nèi)存布局是虛表,父類部分,子類部分(編譯器不同可能會有差異),當一個父類指針指向子類時,會發(fā)生內(nèi)存的截斷,截斷子類部分(內(nèi)存地址偏移),但是此時子類的虛表中的函數(shù)指針實際上還是指向了自己的實現(xiàn),所以此時的指針才會調(diào)用到子類的虛函數(shù),如果不是虛函數(shù),因為內(nèi)存已經(jīng)截斷沒有子類的非虛函數(shù)信息了,所以只能調(diào)用父類的了,這種繼承關(guān)系讓c++的虛表的初始化非常清晰,在一個對象初始化時先調(diào)用父類的構(gòu)造此時虛表跟父類是一樣的,接下來初始化子類,此時編譯器就會去識別子類有沒有覆蓋父類的虛函數(shù),如果有則虛表中相應(yīng)的函數(shù)指針改成自己的虛函數(shù)實現(xiàn)指針。

那么go有什么不同呢,首先我們很清楚go是沒有嚴格意義上的繼承的,go的接口不存在繼承關(guān)系,只要實現(xiàn)了接口定義的方法都可以成為接口類型,這給go的虛表初始化帶來很大的麻煩,到底有多少類型實現(xiàn)了這個接口,一個類型到底實現(xiàn)了多少接口這讓編譯器很confused。舉個例子,某個類型有m個方法,某接口有n個方法,則很容易知道這種判定的時間復(fù)雜度為O(mXn),不過可以使用預(yù)先排序的方式進行優(yōu)化,實際的時間復(fù)雜度為O(m+n)這樣看來其實還行那為什么要在運行時生成虛表呢,這不是會拖慢程序的運行速度嗎,注意我們這里是某個類型,某個接口,是1對1的關(guān)系,如果有n個類型,n個接口呢,編譯器難道要把之間所有的關(guān)系都理清嗎?退一步說就算編譯器任勞任怨把這事干了,可是你在寫過程中你本來就不想實現(xiàn)那個接口,而你無意中給這個類型實現(xiàn)的方法中包含了某些接口的方法,你根本不需要這個接口(況且go的接口機制會導致很多這種無意義的接口實現(xiàn)),你欺負編譯器就行了,這也太欺負人了吧。如果我們放到運行時呢,我們只要在需要接口的去分析一下類型是否實現(xiàn)了接口的所有方法就行了很簡單的一件事。

三 空接口

接口類型的一個極端重要的例子是空接口:interface{} ,它表示空的方法集合,由于任何值都有零個或者多個方法,所以任何值都可以滿足它。 注意,[]T不能直接賦值給[]interface{}

//t := []int{1, 2, 3, 4} wrong 
//var s []interface{} = t 
t := []int{1, 2, 3, 4} //right 
s := make([]interface{}, len(t)) 
for i, v := range t { 
 s[i] = v 
} 
str, ok := value.(string) 
if ok { 
 fmt.Printf("string value is: %q\n", str) 
} else { 
 fmt.Printf("value is not a string\n") 
} 

在Go語言中,我們可以使用type switch語句查詢接口變量的真實數(shù)據(jù)類型,語法如下:

type Stringer interface { 
  String() string 
} 
 
var value interface{} // Value provided by caller. 
switch str := value.(type) { 
case string: 
  return str //type of str is string 
case Stringer: //type of str is Stringer 
  return str.String() 
} 

也可以使用“comma, ok”的習慣用法來安全地測試值是否為一個字符串:

str, ok := value.(string) 
if ok { 
  fmt.Printf("string value is: %q\n", str) 
} else { 
  fmt.Printf("value is not a string\n") 
} 

四 接口賦值

package main 
 
import ( 
"fmt" 
) 
 
type LesssAdder interface { 
  Less(b Integer) bool 
  Add(b Integer) 
} 
 
type Integer int 
 
func (a Integer) Less(b Integer) bool { 
  return a  b 
} 
 
func (a *Integer) Add(b Integer) { 
  *a += b 
} 
 
func main() { 
 
  var a Integer = 1 
  var b LesssAdder = a 
  fmt.Println(b) 
 
  //var c LesssAdder = a 
  //Error:Integer does not implement LesssAdder  
  //(Add method has pointer receiver) 
} 

go語言可以根據(jù)下面的函數(shù):

func (a Integer) Less(b Integer) bool  

自動生成一個新的Less()方法

func (a *Integer) Less(b Integer) bool  

這樣,類型*Integer就既存在Less()方法,也存在Add()方法,滿足LessAdder接口。 而根據(jù)

func (a *Integer) Add(b Integer) 

這個函數(shù)無法生成以下成員方法:

func(a Integer) Add(b Integer) { 
  (a).Add(b) 
} 

因為(a).Add()改變的只是函數(shù)參數(shù)a,對外部實際要操作的對象并無影響(值傳遞),這不符合用戶的預(yù)期。所以Go語言不會自動為其生成該函數(shù)。因此類型Integer只存在Less()方法,缺少Add()方法,不滿足LessAddr接口。(可以這樣去理解:指針類型的對象函數(shù)是可讀可寫的,非指針類型的對象函數(shù)是只讀的)將一個接口賦值給另外一個接口 在Go語言中,只要兩個接口擁有相同的方法列表(次序不同不要緊),那么它們就等同的,可以相互賦值。 如果A接口的方法列表時接口B的方法列表的子集,那么接口B可以賦值給接口A,但是反過來是不行的,無法通過編譯。

五 接口查詢

接口查詢是否成功,要在運行期才能夠確定。他不像接口的賦值,編譯器只需要通過靜態(tài)類型檢查即可判斷賦值是否可行。

var file1 Writer = ...
if file5,ok := file1.(two.IStream);ok {
...
}

這個if語句檢查file1接口指向的對象實例是否實現(xiàn)了two.IStream接口,如果實現(xiàn)了,則執(zhí)行特定的代碼。

在Go語言中,你可以詢問它指向的對象是否是某個類型,比如,

var file1 Writer = ...
if file6,ok := file1.(*File);ok {
...
}

這個if語句判斷file1接口指向的對象實例是否是*File類型,如果是則執(zhí)行特定的代碼。

slice := make([]int, 0)
slice = append(slice, 1, 2, 3)

var I interface{} = slice


if res, ok := I.([]int);ok {
  fmt.Println(res) //[1 2 3]
}

這個if語句判斷接口I所指向的對象是否是[]int類型,如果是的話輸出切片中的元素。

func Sort(array interface{}, traveser Traveser) error {

  if array == nil {
    return errors.New("nil pointer")
  }
  var length int //數(shù)組的長度
  switch array.(type) {
  case []int:
    length = len(array.([]int))
  case []string:
    length = len(array.([]string))
  case []float32:
    length = len(array.([]float32))

  default:
    return errors.New("error type")
  }

  if length == 0 {
    return errors.New("len is zero.")
  }

  traveser(array)

  return nil
}

通過使用.(type)方法可以利用switch來判斷接口存儲的類型。

小結(jié): 查詢接口所指向的對象是否為某個類型的這種用法可以認為是接口查詢的一個特例。接口是對一組類型的公共特性的抽象,所以查詢接口與查詢具體類型區(qū)別好比是下面這兩句問話的區(qū)別:

你是醫(yī)生么?

是。

你是莫莫莫


第一句問話查詢的是一個群體,是查詢接口;而第二個問句已經(jīng)到了具體的個體,是查詢具體類型。

除此之外利用反射也可以進行類型查詢,會在反射中做詳細介紹。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Golang 使用接口實現(xiàn)泛型的方法示例
  • golang分層測試之http接口測試入門教程
  • golang基礎(chǔ)之Interface接口的使用
  • 初步解讀Golang中的接口相關(guān)編寫方法
  • golang中接口對象的轉(zhuǎn)型兩種方式

標簽:瀘州 晉中 泰安 東營 駐馬店 阿壩 昭通 滄州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《golang中interface接口的深度解析》,本文關(guān)鍵詞  golang,中,interface,接口,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang中interface接口的深度解析》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang中interface接口的深度解析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    女人被狂躁c到高潮| 亚洲人成网址| 首页亚洲欧美制服丝腿| 国产欧美一区二区三区鸳鸯浴| 精品国产精品国产偷麻豆| 欧美日韩精品电影| 无码人妻丰满熟妇区96| 色8久久久久| 深夜影院在线观看| 日韩欧国产精品一区综合无码| 欧美专区在线播放| 成人视屏在线观看| 无遮挡动作视频在线观看免费入口| 亚洲午夜激情| 侵犯稚嫩小箩莉h文系列小说| 性直播体位视频在线观看| 一区二区三区精品在线观看| 国产草草浮力影院| 视频亚洲一区二区| 亚洲自拍小视频免费观看| 狠狠久久亚洲欧美专区| 高清视频在线观看一区| 天天鲁一鲁摸一摸爽一爽| 成人在线免费电影| 一个人看的www视频在线免费观看| 97香蕉超级碰碰久久免费软件| 成人ww免费完整版在线观看| 国产亚洲精品女人久久久久久| 麻豆视频在线免费看| 韩国一级黄色录像| 星空无限传媒在线| 亚洲综合色自拍一区| 亚洲天堂av网站| 国产精品嫩草影院com| 久久久美女视频| 久久社区一区| 亚洲免费一在线| av天天在线| 亚洲精品视频中文字幕| 国产伦一区二区三区| 欧美一级成年大片在线观看| 亚洲高清毛片一区二区| 一级黄在线观看| 91香蕉视频在线| 亚洲精品网址在线观看| 灌醉mj刚成年的大学平面模特| 免费毛片aaaaaa| 久久久久久久高清| 国产精品自在在线| 日韩av免费| 亚洲精品手机在线观看| 欧美成人vr18sexvr| 免费福利在线视频| 国产精品久久久爽爽爽麻豆色哟哟| 在线久久视频| 久久久久亚洲天堂| 一区二区三区视频免费观看| 黄色软件在线观看| 成人久久视频在线观看| 国产精品福利视频| 在线成人www免费观看视频| 美女露出粉嫩尿囗让男人桶| 最新精品视频| 日日操免费视频| 亚洲区小说区| 性xxxx视频| 亚洲第一搞黄网站| 国产精品中出一区二区三区| 色94色欧美sute亚洲13| 国产第一区电影| 国产又粗又猛又黄视频| 精品熟妇无码av免费久久| 成人影视免费观看| 五月激情五月婷婷| 少妇一区二区三区四区| 久久精品亚洲成在人线av网址| 男人天堂电影网| 色婷婷久久久综合中文字幕| 午夜视频在线播放| h版电影在线播放视频网站| 中文字幕亚洲欧美| 中文字幕在线观看视频一区| 一本一道波多野毛片中文在线| 日韩黄色片在线观看| 成人午夜视频免费观看| 在线观看亚洲视频啊啊啊啊| 日韩小视频在线观看| 午夜影院在线观看国产主播| 欧美婷婷精品激情| 黄色av网站免费在线观看| 日本中文在线| 久久在精品线影院精品国产| 亚洲成a人片在线不卡一二三区| 亚洲超碰在线观看| 亚洲男人的天堂av| www.色就是色.com| 国产又粗又猛又爽视频| 九九免费精品视频| 在线国产小视频| 中文字幕亚洲综合| 狠狠综合久久av一区二区蜜桃| 精品无码一区二区三区蜜臀| 一区二区三区四区精品视频| 懂色av一区二区三区免费观看| 亚洲成色777777女色窝| 国产区卡一卡二卡三乱码免费| 在线国产电影不卡| 国产在线观看中文字幕| 国产午夜精品视频| 国产精品456| 精品少妇在线视频| 日韩激情中文字幕| 91看片淫黄大片一级在线观看| 中文在线天堂网| 91久久国产综合久久蜜月精品| 亚洲成人77777| 一区二区三区四区五区在线| 97精品国产97久久久久久粉红| 亚洲高清视频网站| 福利片一区二区三区| 国产东北露脸精品视频| 在线成人高清不卡| 国产亚洲精品久久久久久豆腐| www.91在线| 在线观看日本网站| 欧美肥妇毛茸茸| 欧美在线观看视频在线| 91free张津瑜movies| 91理论电影在线观看| 亚洲一区二区精品| 欧洲生活片亚洲生活在线观看| 国产精品人妖ts系列视频| 日韩高清中文字幕| 99久久综合狠狠综合久久止| 精品裸体舞一区二区三区| 成人精品视频网站| 精品一区二区三区高清免费不卡| 国产精品天天干| 亚洲欧洲精品一区二区| 美女又爽又黄| 免费无码毛片一区二三区| 毛片无码国产| 国产超碰在线观看| 中文在线天堂网www| 中文字幕第20页| 国产你懂的在线观看| 亚洲线精品一区二区三区八戒| 欧美色网址大全| 一区二区在线观看视频在线| 成人观看视频| 欧美视频网站| 欧美又粗又硬又大久久久| 成人女同在线观看| 欧美精品粉嫩高潮一区二区| 亚洲少妇最新在线视频| 日韩一区二区三区四区视频| 国产精品-色哟哟| 亚洲国产高清自拍| 国产精品女人毛片| 国产精品免费电影| www.日韩av| 黄色小视网站| 欧美亚洲另类久久综合| 欧美日韩精品一区二区三区在线观看| 成人国产精品日本在线| 欧美色另类天堂2015| 一个色的综合| 欧美一级中文字幕| 欧洲精品视频在线观看| 婷婷六月综合| 中文字幕日韩欧美精品在线观看| 国产精品乱码久久久久久| 国产成人久久精品一区二区三区| 麻豆免费精品视频| 自拍视频一区| 精品免费日产一区一区三区免费| 欧美18一14sex性处hd| 神马午夜在线视频| 久久国产精品偷| 久操网在线观看| 57pao成人永久免费视频| 久久草视频在线看| av成人免费在线观看| 美女被黑人40厘米进入| www日本在线观看| 日韩av影片在线观看| 999色成人| 成人资源在线| 丰满少妇久久久| 日韩欧美在线中字| 国产欧美一区二区三区四区| 亚洲v国产v在线观看| 中文写幕一区二区三区免费观成熟| 成人羞羞在线观看网站| 超碰免费在线| 99thz桃花论族在线播放| 微拍福利一区二区| 精品日韩一区二区| 久久久精品在线视频| 欧美激情三级免费| 亚洲一区亚洲二区亚洲三区| 日韩午夜激情视频| 久久精品二区亚洲w码| 国产精品麻豆入口| 97精品国产露脸对白| 成人av资源| 日韩一级片免费视频| 久久激情久久| 在线视频欧美精品| 久久综合网色—综合色88| 亚洲 国产 图片| 国产精品一 二 三| 欧洲国内综合视频| 久久本道综合色狠狠五月| 狠狠色伊人亚洲综合网站色| 国产成人天天5g影院| 免费一级大片| 色噜噜亚洲精品中文字幕| 91蜜桃免费观看视频| 中文字幕乱码人妻二区三区| 看av免费毛片手机播放| 成人激情电影在线| 久久久久久国产精品mv| 最近中文字幕日韩精品| 日韩美女视频中文字幕| 日韩成人xxxx| 美女任你摸久久| 欧美日韩一区二区高清| 黑人另类av| 色综合色综合色综合色综合色综合| 久久久精品美女| 国产丝袜一区视频在线观看| 性欧美精品孕妇| 欧美午夜精品一区| 亚洲av成人无码久久精品老人| 国产一区二三区好的| av日韩中文字幕| 亚洲自拍另类综合| 国产精品久久久国产盗摄| 亚洲精品五月天| 国产高清视频在线观看| 纪美影视在线观看电视版使用方法| 国产精品一区二区三区四区色| 最新国产露脸在线观看| 亚洲另类在线制服丝袜| 狠狠色噜噜狠狠狠888奇米| 日韩1区在线| 欧美成人免费| 成人黄色短视频在线观看| 国产一区二区av在线| 欧美一区二区大胆人体摄影专业网站| 国产黄色一级网站| 亚洲视频在线二区| 九九热国产精品视频| 超清福利视频| 国产精品无码久久久久成人app| 色香阁99久久精品久久久| 超碰免费在线97| 精品视频成人| 久久精品亚洲人成影院| 亚洲欧美日韩免费| 欧美激情中文字幕一区二区| eeuss鲁片一区二区三区| 鲁一鲁一鲁一鲁一色| 在线观看福利一区| 国产精品自产拍高潮在线观看| 亚洲一区二区在线视频观看| 日本在线视频中文字幕| 又色又爽又高潮免费视频国产| 久久久av免费| 尤物视频网站在线观看| 亚洲天堂久久久| 青草久久视频| 四虎4hu影库永久地址| 欧美91精品久久久久国产性生爱| 三日本三级少妇三级99| 日韩精品专区在线影院观看| 久久久噜噜噜| 91久久国产综合久久| 九九热精品免费视频| 久久精选视频| 黄色高清在线观看| 国产精品视频免费在线观看| 日韩另类视频| 欧美精品18videos性欧美| 国产女同无遮挡互慰高潮91| 亚洲精品美女久久7777777| 亚洲午夜一二三区视频| 欧美性受xxxx黑人猛交| 国产精品精品久久久久久| 亚洲成a人片| 婷婷色中文字幕| 成人午夜看片网址| 国产精品白丝喷水在线观看| 91福利精品在线观看| 精品三级在线观看| 日韩欧美视频在线播放| 国产hs免费高清在线观看| 天堂网在线观看国产精品| 91精品啪aⅴ在线观看国产| 经典三级一区二区| 无码精品一区二区三区在线| 嫩草影院发布页| 51精品国产人成在线观看| 男人精品网站一区二区三区| av观看成片免费网站| 91精品国产91久久久久久最新毛片| 国产无人区码熟妇毛片多| 亚洲欧美一级二级三级| 手机看片久久| 在线免费观看成人| 国产一区二区按摩在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲精品国产手机| 人人鲁人人莫人人爱精品| 国产影视精品一区二区三区| av资源中文在线| 欧美亚视频在线中文字幕免费| www.国产精| 成人永久aaa| 日韩视频久久| 激情一区二区| 日本美女视频网站| 综合欧美一区二区三区| 免费观看黄色一级视频| 亚洲一卡二卡在线| 美女一区视频| 欧美乱大交xxxxx潮喷l头像|