国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Go Interface

2019-11-06 06:03:47
字體:
來源:轉載
供稿:網友

1.Go語言的接口是一些方法的集合,只要一個數據類型附帶的方法集合是某一個接口的方法集合的超級,那么就可以判斷該數據類型實現了這個接口。 2.接口聲明時要以關鍵字type作為開始,除此之外,接口類型聲明還包含了接口類型的名稱、關鍵字interface和由花括號{}括起來的方法聲明的集合。下面是一個簡單的聲明一個A接口示例:

type A interface{ Update() int Delete(i,j int) bool Add(i,j int)}

3.一個接口類型可以嵌入到另外一個接口類型中,可以認為是接口聚合,下面聲明一個B接口,這個接口集合了A接口。

type B interface{ A Remove()}

上面聲明了一個B接口類型,B接口實際上包含了4個方法,分別是Update,Delete,Add,以及Remove,前面的3個方法聲明其實都是被包含在接口類型A中的,也就是說在接口聲明中嵌入另一個接口類型聲明的作用—將一個接口的方法集合中的方法批量地添加到另一個接口的方法集合中。java語言通過接口繼承來實現接口方法的融合,Go語言可以說B接口繼承了A接口。接口類型的嵌入有一個約束,那就是不能嵌入自身,這其中就包括的直接嵌入和間接嵌入,實例如下:

type X interface{ X}//上面這個示例是接口的自我包含,這個是不允許的type Y interface{ Z}type Z interface{ Y}

3.interface可以被任意類型實現,一個對象也可以實現任意多個interface,任意的類型都實現了空interface.

//定義接口類型AItype AI interface { Add(key string) Update(key string) Remove(key string)}//定義接口類型BItype BI interface { Add(key string) Update(key string) Drop(key string)}//定義接口類型CItype CI interface { Add(key string) Update(key string) Compare(key string)}//下面三個方法分別實現了AI接口的三個方法,結構體A實現了AI的所用方法func (h *A)Add(key string){ fmt.4.interface值 1.如果我們定義了一個interface變量,那么這個變量里面可以存實現這個interface的任意類型的對象,上面的例子中,如果我們定義一個AI interface類型的變量ai,那么這個ai可以存放A,B,C的值,以為這些結構體實現了ai的方法集合。

5.空interface 空interface{}不包含任何的method,所有的類型都實現了空interface。空interface對于描述起不到任何的作用,空interface可以存儲任意類型的數值。它有點類似于C語言的void*類型。

// 定義a為空接口var a interface{}var i int = 5s := "Hello world"http:// a可以存儲任意類型的數值a = i //把int類型的變量賦值給interface對象aa = s //把字符串類型的變量賦值給interface對象a

6.interface函數參數 interface的變量可以持有任意實現該interface類型的對象,這給我們編寫函數(包括method)提供了一些額外的思考,我們可以通過定義interface參數,讓函數接受各種類型的參數。

func add(i interface,j interface) interface{}

7.interface變量存儲的類型 interface的變量里面可以存儲任意類型的數值,如何獲取改變量里面實際保存了哪個類型的對象,下面我們介紹兩種方法。go語言有一個語法,可以直接判斷是否是該類型的變量:value,ok = element.(T),這個value就是變量的值,ok是一個bool類型,element是interface變量,T是斷言的類型。如果element里面確實存儲了T類型的數值,那么ok返回true,否則返回false。

8.反射 反射就是能檢查程序在運行時的狀態,go語言反射一般分三步走:

第一步:要去反射一個類型的值,首先把它轉換成reflect對象,比如reflect.Type,reflect.Value,代碼如下://得到類型的元數據,通過t能獲取類型定義里面的所有元素t := reflect.TypeOf(i)//得到實際的值,通過v獲取存儲在里面的值,還可以去改變值t := reflect.ValueOf(i)第二步:轉化為reflect對象之后,然后將reflect對象轉化成相應的值://獲取定義在struct里面的標簽tag := t.Elem().Field(0).Tag //獲取存儲在第一個字段里面的值name := v.Elem().Field(0).String() //獲取反射值能返回相應的類型和數值var x int32=24v := reflect.ValueOf(x);fmt.Println("type:", v.Type())//type: int32fmt.Println("kind is int:", v.Kind() == reflect.Int32)//kind is int: truefmt.Println("value:", v.Int())//value: 24//反射的字段必須是可修改的,也就是說反射的字段可以讀寫。修改一個字段的值代碼如下:var x float64 = 24.1p := reflect.ValueOf(&x)v := p.Elem()v.SetFloat(7.1)

最后,上面闡釋了go interface一般使用,還有一些遺漏就不一一舉例,希望大家能受益。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 卢氏县| 通化县| 云龙县| 宿州市| 延庆县| 太和县| 澎湖县| 瓮安县| 双城市| 临武县| 札达县| 尚义县| 富锦市| 松阳县| 三门峡市| 沅江市| 绥化市| 阳江市| 中西区| 新竹市| 海原县| 德安县| 新晃| 丹江口市| 呼玛县| 南陵县| 沛县| 射阳县| 新余市| 治多县| 富锦市| 鄂托克旗| 宁河县| 内丘县| 沙河市| 汉阴县| 安丘市| 吴江市| 望都县| 盐边县| 永年县|