成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

go語言接口原理,go語言接口原理是什么

『No8: Go 接口』

大家好,我是謝偉,是一名程序員。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),三門峽企業(yè)網(wǎng)站建設(shè),三門峽品牌網(wǎng)站建設(shè),網(wǎng)站定制,三門峽網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,三門峽網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

下面的學(xué)習(xí)是一個(gè)系列,力求從初學(xué)者的角度學(xué)會(huì)go 語言,達(dá)到中級(jí)程序員水平。

這一系列是我的輸出總結(jié),同時(shí)我還推出了視頻版。正在制作過程。

為寫出這些文章,我閱讀了網(wǎng)上諸多熱門的教程和紙質(zhì)書籍。內(nèi)容的實(shí)質(zhì)都是那些,要區(qū)分出差異的話,只能表現(xiàn)在具體實(shí)例層面。所以,實(shí)例我會(huì)選取自己在工作中的項(xiàng)目實(shí)例抽取出來。希望對(duì)大家有所幫助。

我們已經(jīng)研究了:

本節(jié)的主題是:接口

接口是 golang 中最值得強(qiáng)調(diào)的特性。它讓面向?qū)ο?,?nèi)容組織實(shí)現(xiàn)非常的方便。

接口在 go 語言中是一系列方法的集合,原則上方法可以有很多個(gè),但建議4個(gè)左右。

上文中定義了一個(gè) httpClient 的接口,指定了這個(gè)接口可以干這些活: Get、Post、Put、Delete

上文中指定了 httpClient 接口,指定了這個(gè)接口需要干的活是: Get、Post、Put、Delete , 具體的實(shí)現(xiàn)需要靠其他結(jié)構(gòu)體來實(shí)現(xiàn)。

一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)了接口要求的所有的方法(方法的參數(shù)和返回值一致),那么就說這個(gè)結(jié)構(gòu)體實(shí)現(xiàn)了這個(gè)接口

上文中的使用: httpClient 屏蔽了 httpImpl 的內(nèi)部細(xì)節(jié),而依然可以使用 Get 方法,去完成任務(wù)。

當(dāng)然接口可以被諸多結(jié)構(gòu)體實(shí)現(xiàn),只需存在接口定義的幾種方法即可。

接口和結(jié)構(gòu)體的定義很相似,也可以完成嵌入接口的功能,嵌入的匿名的接口,可以自動(dòng)的具備被嵌入的接口的方法。

結(jié)構(gòu)體實(shí)現(xiàn) String 方法即可實(shí)現(xiàn)結(jié)構(gòu)化輸出結(jié)構(gòu)體。

實(shí)現(xiàn)Error 方法即可自定義錯(cuò)誤類型。

這幾個(gè)讀寫接口在好些庫中實(shí)現(xiàn)了,后續(xù)我們?cè)儆懻摗?/p>

Any 類型

空接口在 go 里,可以當(dāng)成任意類型,意味著,比如你的函數(shù)或者方法不知道傳入的參數(shù)的類型,可以直接定義為 interface{}

類型斷言

類型斷言的使用場(chǎng)景是:接口類型的變量可以包含任何類型的值。如何判斷變量的真實(shí)類型?

比如解析一個(gè)不知道字段類型的 json, 常常需要使用到類型斷言。

可以使用:

ok...idiom

varInterface.(T), varInterface 必須是接口、T 則是具體的實(shí)現(xiàn)接口的結(jié)構(gòu)體

switch ..case...

.(type) 只在 switch 語句里才能使用。

以上就是接口的全部?jī)?nèi)容,接口是go 中最特別的特性。借助 接口, go 實(shí)現(xiàn)面向?qū)ο笾械睦^承和多態(tài)。

接口是方法的集合,只定義具體要干什么,而怎么干,則由其他的結(jié)構(gòu)體的方法實(shí)現(xiàn)。這樣不同的結(jié)構(gòu)體的方法的具體處理不同,實(shí)現(xiàn)的接口的功能就不一樣。

盡管如此,接口并不意味著可以隨意濫用。我們最好是根據(jù)面向?qū)ο蟮目陀^實(shí)體,抽象出接口和方法。

本節(jié)完,再會(huì)。

為什么我不喜歡Go語言式的接口

所謂Go語言式的接口,就是不用顯示聲明類型T實(shí)現(xiàn)了接口I,只要類型T的公開方法完全滿足接口I的要求,就可以把類型T的對(duì)象用在需要接口I的地方。這種做法的學(xué)名叫做Structural Typing,有人也把它看作是一種靜態(tài)的Duck Typing。除了Go的接口以外,類似的東西也有比如Scala里的Traits等等。有人覺得這個(gè)特性很好,但我個(gè)人并不喜歡這種做法,所以在這里談?wù)勊娜秉c(diǎn)。當(dāng)然這跟動(dòng)態(tài)語言靜態(tài)語言的討論類似,不能簡(jiǎn)單粗暴的下一個(gè)“好”或“不好”的結(jié)論。

我的觀點(diǎn):

Go的隱式接口Duck Typing確實(shí)不是新技術(shù), 但是在主流靜態(tài)編程語言中支持Duck Typing應(yīng)該是很少的(不清楚目前是否只有Go語言支持).

靜態(tài)類型和動(dòng)態(tài)類型雖然沒有絕對(duì)的好和不好, 但是每個(gè)都是有自己的優(yōu)勢(shì)的, 沒有哪一個(gè)可以包辦一切. 而Go是試圖結(jié)合靜態(tài)類型和動(dòng)態(tài)類型(interface)各自的優(yōu)勢(shì).

那么就從頭談起:什么是接口。其實(shí)通俗的講,接口就是一個(gè)協(xié)議,規(guī)定了一組成員,例如.NET里的ICollection接口:

public interface ICollection {

int Count { get; }

object SyncRoot { get; }

bool IsSynchronized { get; }

void CopyTo(Array array, int index);

}

這就是一個(gè)協(xié)議的全部了嗎?事實(shí)并非如此,其實(shí)接口還規(guī)定了每個(gè)行為的“特征”。打個(gè)比方,這個(gè)接口的Count除了需要返回集合內(nèi)元素的數(shù)目以外,還隱含了它需要在O(1)時(shí)間內(nèi)返回這個(gè)要求。這樣一個(gè)使用了ICollection接口的方法才能放心地使用Count屬性來獲取集合大小,才能在知道這些特征的情況下選用正確的算法來編寫程序,而不用擔(dān)心帶來性能問題,這才能實(shí)現(xiàn)所謂的“面向接口編程”。當(dāng)然這種“特征”并不但指“性能”上的,例如Count還包含了例如“不修改集合內(nèi)容”這種看似十分自然的隱藏要求,這都是ICollection協(xié)議的一部分。

如何理解go的接口,有什么用處

如果說類是對(duì)數(shù)據(jù)和方法的抽象和封裝,那么接口就是對(duì)類的抽象。

這里使用Java來說明,Java中的接口與`Go`中的接口是類似的,只不過Java中要顯式的聲明實(shí)現(xiàn)某個(gè)接口,而Go中不需要顯式的聲明實(shí)現(xiàn)了某個(gè)接口,只要實(shí)現(xiàn)了其中的所有方法,就默認(rèn)為實(shí)現(xiàn)了該接口。

比如說有一個(gè)Person接口:

public interface Person{ void walk();

}

有一個(gè)Student類實(shí)現(xiàn)了Person接口

public class Student implements Person { //實(shí)現(xiàn)walk方法

@Override

public void walk(){

System.out.print("Student.walk()");

} //...其他方法}

有一個(gè)Teacher類也實(shí)現(xiàn)了Person接口

public class Teacher implements Person { //實(shí)現(xiàn)walk方法

@Override

public void walk(){

System.out.print("Teacher.walk()");

} //...其他方法}

在某個(gè)類中可以這樣使用

public class SomeClass{ //這里接收一個(gè)Person類型

public static void usePerson(Person p){

p.walk()

}

public static void main(String[] args){ //可以接收任何實(shí)現(xiàn)了Person接口的類的對(duì)象

usePerson(new Student());

usePerson(new Teacher());

}

}

使用接口的好處是非常靈活,這樣就與具體的實(shí)現(xiàn)做了解耦,如果以后有其他的實(shí)現(xiàn)類,只需要實(shí)現(xiàn)Person接口就可以了,而不用去改使用的時(shí)候的代碼。

新聞名稱:go語言接口原理,go語言接口原理是什么
分享路徑:http://jinyejixie.com/article34/hsiose.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、網(wǎng)站排名、移動(dòng)網(wǎng)站建設(shè)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
黑龙江省| 辽宁省| 麻栗坡县| 澄城县| 桂阳县| 江油市| 从江县| 长宁县| 常山县| 丰宁| 新河县| 台安县| 洛川县| 柘城县| 蛟河市| 鄯善县| 鞍山市| 舞阳县| 罗江县| 昌江| 泰来县| 内江市| 阿瓦提县| 许昌县| 嵩明县| 伽师县| 谢通门县| 怀来县| 安新县| 遵化市| 孟连| 洛扎县| 镇远县| 龙口市| 延寿县| 古浪县| 襄樊市| 仪征市| 中西区| 兰考县| 阿拉尔市|