本篇內(nèi)容主要講解“Go語言接口賦值實例介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Go語言接口賦值實例介紹”吧!
成都創(chuàng)新互聯(lián)專注于扎囊網(wǎng)站建設(shè)服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供扎囊營銷型網(wǎng)站建設(shè),扎囊網(wǎng)站制作、扎囊網(wǎng)頁設(shè)計、扎囊網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務,打造扎囊網(wǎng)絡公司原創(chuàng)品牌,更為您提供扎囊網(wǎng)站排名全網(wǎng)營銷落地服務。
先看看將指定類型的對象實例賦值給接口,這要求該對象對應的類實現(xiàn)了接口要求的所有方法,這個是自然,否則也就不能算作實現(xiàn)該接口了,例如之前我們定義過一個Integer類型
type Integer int func (a Integer) Equal(i Integer) bool { return a == i} func (a Integer) LessThan(i Integer) bool { return a < i} func (a Integer) MoreThan(i Integer) bool { return a > i} func (a *Integer) Increase(i Integer) { *a = *a + i} func (a *Integer) Decrease(i Integer) { *a = *a - i}
相應地,我們定義一個接口IntNumber:
type IntNumber interface { Equal(i Integer) bool LessThan(i Integer) bool MoreThan(i Integer) bool Increase(i Integer) Decrease(i Integer)}
安裝 Go 語言的約定,Integer類型實現(xiàn)了IntNumber接口。然后我們可以這樣將Integer類型對應的對象實例賦值給IntNumber接口:
var a Integer = 1var b IntNumber = &a
注意到上述賦值語句中,我們將對象實例a的指針應用賦值給了接口變量,為什么要這么做呢?因為 Go 語言會根據(jù)類似下面這樣的非指針成員方法:
func (a Integer) Equal(i Integer) bool
自動生成一個新的與之對應的指針成員方法:
func (a *Integer) Equal(i Integer) bool { return (*a).Equal(i)}
這樣一來,類型*Integer就存在所有IntNumber接口中聲明的方法,而Integer類型不包含指針方法Increase和Decrease(關(guān)于這一點我們前面已經(jīng)介紹過),所以嚴格來說,只有*Integer類型實現(xiàn)了IntNumber接口。如果我們貿(mào)然將a的值引用賦值給b,編譯時會報錯:
cannot use a (type Integer) as type IntNumber in assignment: Integer does not implement IntNumber (Decrease method has pointer receiver)
顯然,如果Integer類中實現(xiàn)的方法不是指針方法,則進行接口賦值時,傳遞對象實例的值引用給接口變量即可,否則需要傳遞指針變量。為了驗證這一點,我們可以再創(chuàng)建一個新的接口IntNumber2:
type IntNumber2 interface { Equal(i Integer) bool LessThan(i Integer) bool MoreThan(i Integer) bool}
然后將對象實例a的值引用賦值給IntNumber接口變量:
var a Integer = 1varb1IntNumber=&avar b2 IntNumber2 = a
則上面兩條接口賦值語句都可以編譯通過。
接下來我們來看將一個接口賦值給另一個接口:在 Go 語言中,只要兩個接口擁有相同的方法列表(與順序無關(guān)),那么它們就是等同的,可以相互賦值。
下面我們來編寫對應的示例代碼,這是第一個接口Number1,位于oop1包中:
package oop1 type Number1 interface { Equal(i int) bool LessThan(i int) bool MoreThan(i int) bool}
這是第二個接口Number2,位于oop2包中:
package oop2 type Number2 interface { Equal(i int) bool MoreThan(i int) bool LessThan(i int) bool}
這里我們定義了兩個接口,一個叫oop1.Number1,一個叫oop2.Number2,兩者都定義五個相同的方法,只是順序不同而已。在 Go 語言中,這兩個接口實際上并無區(qū)別,因為:
任何實現(xiàn)了oop1.Number1接口的類,也實現(xiàn)了oop2.Number2;任何實現(xiàn)了oop1.Number1接口的對象實例都可以賦值給oop2.Number2,反之亦然;在任何地方使用oop1.Number1接口與使用oop2.Number2并無差異。
接下來我們定義一個實現(xiàn)了這兩個接口的類Number:
type Number int; func (n Number) Equal(i int) bool { return int(n) == i;} func (n Number) LessThan(i int) bool { return int(n) < i;} func (n Number) MoreThan(i int) bool { return int(n) > i;}
所以下面這些賦值代碼都是合法的,會編譯通過:
var num1 Number = 1;var num2 oop1.Number1 = num1var num3 oop2.Number2 = num2
此外,接口賦值并不要求兩個接口完全等價(方法完全相同)。如果接口 A 的方法列表是接口 B 的方法列表的子集,那么接口 B 可以賦值給接口 A。例如,假設(shè)Number2接口定義如下:
type Number2 interface { Equal(i int) bool MoreThan(i int) bool LessThan(i int) bool Add(i int)}
要讓Number類繼續(xù)保持實現(xiàn)這兩個接口,需要在Number類定義中新增一個Add方法實現(xiàn):
func (n *Number) Add(i int) { *n = *n + Number(i);}
接下來,將上面的接口賦值語句改寫如下即可:
var num1 oop1.Number = 1;var num2 oop2.Number2 = &num1;var num3 oop1.Number1 = num2;
但是反過來不行:
var num1 oop1.Number = 1;var num2 oop1.Number1 = &num1;var num3 oop2.Number2 = num2; // 這一段編譯出錯
因為Number1接口中沒有Add方法,這一點和 PHP/Java 中子類實例可以直接賦值給父類,而父類實例不能直接賦值給子類頗有些異曲同工。
到此,相信大家對“Go語言接口賦值實例介紹”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
當前題目:Go語言接口賦值實例介紹
網(wǎng)站網(wǎng)址:http://vcdvsql.cn/article8/iipcop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、用戶體驗、Google、服務器托管、軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)