亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go之interface的具體使用

2020-04-01 18:58:35
字體:
來源:轉載
供稿:網友

淺顯地了解了一下 Go,發現 Go 語法的設計非常簡潔,易于理解。正應了 Go 語言之父 Rob Pike 說的那句“Less is more”—— 大道至簡。

下面就具體的語法特性說說我自己的體會。

interface

概覽

與通常以類型層次與繼承為根基的面向對象設計(OOP)語言(如C++、Java)不同,Go 的核心思想就是組合(composition)。Go 進一步解耦了對象與操作,實現了真正的鴨子類型(Duck typing):一個對象如果能嘎嘎叫那就能當做鴨子,而不是像 C++ 或 Java 那樣需要類型系統去保證:一個對象先得是只鴨子,然后才能嘎嘎叫。

type Duck interface {  Quack()}type Animal struct {  name string}func (animal Animal) Quack() {  fmt.Println(animal.name, ": Quack! Quack! Like a duck!")}func main() {  unknownAnimal := Animal{name: "Unknown"}  var equivalent Duck  equivalent = unknownAnimal  equivalent.Quack()}

運行上面的代碼輸出:

Unknown : Quack! Quack! Like a duck!

下面用 Java 語言來實現:

interface Duck {  void Quack();}class SomeAnimal implements Duck {  String name;  public SomeAnimal(String name) {    this.name = name;  }  public void Quack() {    System.out.println(name + ": Quack! Quack! I am a duck!");  }}public class Test {  public static void main(String []args){    SomeAnimal unknownAnimal = new SomeAnimal("Unknown");    Duck equivalent = unknownAnimal;    equivalent.Quack();  }}

兩相比較就能看出:Go 將對象與對其的操作(方法或函數)解耦得更徹底。Go 并不需要一個對象通過類型系統來保證實現了某個接口(is a),而只需要這個對象實現了某個接口的方法即可(like a),而且類型聲明與方法聲明或實現也是松耦合的形式。如果稍微轉換一下方法的實現方式:

func (animal Animal) Quack() {  fmt.Println(animal.name, ": Quack! Quack! Like a duck!")}

為:

func Quack(animal Animal) {  fmt.Println(animal.name, ": Quack! Quack! Like a duck!")}

是不是就和普通方法并無二致了?

在深入淺出 Cocoa 之消息一文中我曾分析過 Objective C 的消息調用過程:

Bird * aBird = [[Bird alloc] init];[aBird fly];

中對 fly 的調用,編譯器通過插入一些代碼,將之轉換為對方法具體實現 IMP 的調用,這個 IMP 是通過在 Bird 的類結構中的方法鏈表中查找名稱為 fly 的選擇子 SEL 對應的具體方法實現找到的,編譯器會將消息調用轉換為對消息函數 objc_msgSend的調用:

objc_msgSend(aBird, @selector(fly));

無論是 Objective C 的消息機制還是 Qt 中的 Signal/Slot 機制,可以說都是在嘗試將對象本身(數據)與對對象的操作(消息)解耦,但 Go 將這個工作在語言層面做得更加徹底,這樣不僅避免多重繼承問題,還體現出面向對象設計中最要緊的事情:對象間的消息傳遞。

實現

interface 實際上就是一個結構體,包含兩個成員。其中一個成員是指向具體數據的指針,另一個成員中包含了類型信息。空接口和帶方法的接口略有不同,下面分別是空接口和帶方法的接口是使用的數據結構:

struct Eface{  Type*  type;  void*  data;};struct Iface{  Itab*  tab;  void*  data;};struct Itab{  InterfaceType*  inter;  Type*  type;  Itab*  link;  int32  bad;  int32  unused;  void  (*fun[])(void);};struct Type{  uintptr size;  uint32 hash;  uint8 _unused;  uint8 align;  uint8 fieldAlign;  uint8 kind;  Alg *alg;  void *gc;  String *string;  UncommonType *x;  Type *ptrto;};

先看Eface,它是interface{}底層使用的數據結構。數據域中包含了一個void*指針,和一個類型結構體的指針。interface{}扮演的角色跟C語言中的void*是差不多的,Go中的任何對象都可以表示為interface{}。不同之處在于,interface{}中有類型信息,于是可以實現反射。

不同類型數據的類型信息結構體并不完全一致,Type是類型信息結構體中公共的部分,其中size描述類型的大小,UncommonType是指向一個函數指針的數組,收集了這個類型的具體實現的所有方法。

在reflect包中有個KindOf函數,返回一個interface{}的Type,其實該函數就是簡單的取Eface中的Type域。

Iface和Eface略有不同,它是帶方法的interface底層使用的數據結構。data域同樣是指向原始數據的,Itab中不僅存儲了Type信息,而且還多了一個方法表fun[]。一個Iface中的具體類型中實現的方法會被拷貝到Itab的fun數組中。

Type的UncommonType中有一個方法表,某個具體類型實現的所有方法都會被收集到這張表中。reflect包中的Method和MethodByName方法都是通過查詢這張表實現的。表中的每一項是一個Method,其數據結構如下:

struct Method{  String *name;  String *pkgPath;  Type  *mtyp;  Type *typ;  void (*ifn)(void);  void (*tfn)(void);};

Iface的Itab的InterfaceType中也有一張方法表,這張方法表中是接口所聲明的方法。其中每一項是一個IMethod,數據結構如下:

struct IMethod{  String *name;  String *pkgPath;  Type *type;};

 跟上面的Method結構體對比可以發現,這里是只有聲明沒有實現的。

Iface中的Itab的func域也是一張方法表,這張表中的每一項就是一個函數指針,也就是只有實現沒有聲明。

類型轉換時的檢測就是看Type中的方法表是否包含了InterfaceType的方法表中的所有方法,并把Type方法表中的實現部分拷到Itab的func那張表中。

注意事項

一個interface在沒有進行初始化時,對應的值是nil。也就是說:

var v interface{}

此時v就是一個nil。在底層存儲上,它是一個空指針。

與之不同的情況

var obj *Tvar v interface{}v = obj

此時v是一個interface,它的值是nil,也就是說其data域為空,但它自身不為nil。

下面來看個例子就明白了:
Go語言中的error類型實際上是抽象了Error()方法的error接口:

type error interface {  Error() string}

有如下代碼:

type Error struct {  errCode uint8}func (e *Error) Error() string {  switch e.errCode {  default:    return "unknown error"  }}func test_checkError() {  var e *Error  if e == nil {    fmt.Println("e is nil")  } else {    fmt.Println("e is not nil")  }  var err error  err = e  if err == nil {    fmt.Println("err is nil")  } else {    fmt.Println("err is not nil")  }}

運行test_checkError()輸出:

e is nil
err is not nil

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人精品在线观看| 91av在线影院| 久久久久亚洲精品成人网小说| 深夜精品寂寞黄网站在线观看| 成人网在线免费看| 国产91九色视频| 久久91超碰青草是什么| 色综合伊人色综合网| 欧美三级欧美成人高清www| 欧美日韩在线免费| 精品国产乱码久久久久久婷婷| xvideos亚洲| 中文字幕亚洲无线码在线一区| 日韩免费av一区二区| 欧美精品videossex性护士| 国产91精品黑色丝袜高跟鞋| 国产视频久久久久| 在线精品91av| 亚洲精品影视在线观看| 国产精品欧美在线| 日韩成人中文电影| 亚洲第一精品久久忘忧草社区| 成人夜晚看av| 久久99青青精品免费观看| 亚洲影影院av| 91精品视频网站| 美女国内精品自产拍在线播放| 国产日韩换脸av一区在线观看| 欧美黑人巨大xxx极品| 欧美整片在线观看| 亚洲综合在线小说| 国产精品扒开腿做| 91精品国产网站| 性欧美亚洲xxxx乳在线观看| 欧美激情视频网| 日韩精品有码在线观看| 一区二区三区回区在观看免费视频| 色中色综合影院手机版在线观看| 亚洲一区二区久久| 国产精品久久久久9999| 中文字幕免费精品一区高清| 精品女同一区二区三区在线播放| 欧美老少配视频| 欧美精品999| 日韩欧美国产免费播放| 欧美高跟鞋交xxxxhd| 自拍偷拍亚洲区| 亚洲成人精品久久久| 欧美高清第一页| 久久色免费在线视频| 亚洲成人精品av| 91精品视频大全| 国产精品丝袜视频| 日本免费一区二区三区视频观看| 国内精品美女av在线播放| 欧美精品一区三区| 美乳少妇欧美精品| 51精品在线观看| 国产精品日韩欧美大师| 国产色婷婷国产综合在线理论片a| 久久青草精品视频免费观看| 日韩中文字幕在线视频| 2025国产精品视频| 久久久久久久香蕉网| 亚洲综合成人婷婷小说| 中文字幕一区日韩电影| 最近日韩中文字幕中文| 91久久精品国产91久久性色| 黑人与娇小精品av专区| 精品久久久久国产| 国产精品自产拍在线观| 欧美香蕉大胸在线视频观看| 日韩av免费一区| 18一19gay欧美视频网站| 久久久久久久电影一区| 久久亚洲精品国产亚洲老地址| 欧美激情亚洲精品| 亚洲最大福利视频| 成人免费大片黄在线播放| 国产午夜精品久久久| 热99在线视频| 欧美亚洲另类在线| 国产精品亚洲综合天堂夜夜| 91在线视频精品| 久久久极品av| 国产亚洲激情在线| 欧美xxxx做受欧美.88| 97精品国产97久久久久久免费| 亚洲高清av在线| 亚洲精品国产品国语在线| 亚洲免费视频在线观看| 欧美激情一区二区三区成人| 日韩精品中文字幕在线观看| 日本午夜精品理论片a级appf发布| 中日韩美女免费视频网址在线观看| 亚洲精品短视频| 欧美日韩在线看| 日韩免费精品视频| 人人爽久久涩噜噜噜网站| 精品久久久国产| 国产噜噜噜噜久久久久久久久| 国产精品av在线| 欧美午夜精品在线| 中文字幕久精品免费视频| 91丨九色丨国产在线| 成人久久一区二区三区| 欧美亚洲一级片| 日韩欧美在线字幕| 亚洲精品不卡在线| 国产精品久久久久久久久久尿| 亚洲欧美日韩另类| 国产专区欧美专区| 91av在线视频观看| 色七七影院综合| 欧美一区二区三区……| 久久久久久久久久久免费| 97色在线观看免费视频| 国产视频亚洲精品| 日韩欧美国产中文字幕| 精品久久久国产| 一级做a爰片久久毛片美女图片| 欧美在线观看视频| 精品久久香蕉国产线看观看亚洲| 欧美在线播放视频| 成人激情春色网| 欧美精品18videos性欧美| 亚洲欧洲高清在线| 国产成人精品在线播放| 欧美又大粗又爽又黄大片视频| 欧美国产日韩在线| 日本乱人伦a精品| 538国产精品视频一区二区| 欧美日韩福利视频| 国产在线精品成人一区二区三区| 国产97在线亚洲| 欧美大尺度在线观看| 日韩在线播放视频| 久久天天躁狠狠躁夜夜爽蜜月| 久久久久久噜噜噜久久久精品| 国产亚洲人成a一在线v站| 日韩久久精品成人| 欧美在线视频免费播放| 亚洲男人天堂视频| 北条麻妃一区二区三区中文字幕| 色噜噜狠狠狠综合曰曰曰| 国产精品欧美久久久| 亚洲成人网av| 久久成人在线视频| 狠狠躁夜夜躁人人躁婷婷91| 人人爽久久涩噜噜噜网站| 日本免费久久高清视频| 日本成人精品在线| 日韩免费av一区二区| 欧美精品久久一区二区| 在线播放日韩精品| 久久这里只有精品视频首页| 色婷婷综合久久久久中文字幕1| 狠狠爱在线视频一区| 欧美亚洲成人网| 一个人看的www久久| 日韩影视在线观看| 久久天堂电影网| 欧美激情高清视频| 中文字幕久精品免费视频|