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

成都創新互聯是一家集網站建設,三門峽企業網站建設,三門峽品牌網站建設,網站定制,三門峽網站建設報價,網絡營銷,網絡優化,三門峽網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
下面的學習是一個系列,力求從初學者的角度學會go 語言,達到中級程序員水平。
這一系列是我的輸出總結,同時我還推出了視頻版。正在制作過程。
為寫出這些文章,我閱讀了網上諸多熱門的教程和紙質書籍。內容的實質都是那些,要區分出差異的話,只能表現在具體實例層面。所以,實例我會選取自己在工作中的項目實例抽取出來。希望對大家有所幫助。
我們已經研究了:
本節的主題是:接口
接口是 golang 中最值得強調的特性。它讓面向對象,內容組織實現非常的方便。
接口在 go 語言中是一系列方法的集合,原則上方法可以有很多個,但建議4個左右。
上文中定義了一個 httpClient 的接口,指定了這個接口可以干這些活: Get、Post、Put、Delete
上文中指定了 httpClient 接口,指定了這個接口需要干的活是: Get、Post、Put、Delete , 具體的實現需要靠其他結構體來實現。
一個結構體實現了接口要求的所有的方法(方法的參數和返回值一致),那么就說這個結構體實現了這個接口
上文中的使用: httpClient 屏蔽了 httpImpl 的內部細節,而依然可以使用 Get 方法,去完成任務。
當然接口可以被諸多結構體實現,只需存在接口定義的幾種方法即可。
接口和結構體的定義很相似,也可以完成嵌入接口的功能,嵌入的匿名的接口,可以自動的具備被嵌入的接口的方法。
結構體實現 String 方法即可實現結構化輸出結構體。
實現Error 方法即可自定義錯誤類型。
這幾個讀寫接口在好些庫中實現了,后續我們再討論。
Any 類型
空接口在 go 里,可以當成任意類型,意味著,比如你的函數或者方法不知道傳入的參數的類型,可以直接定義為 interface{}
類型斷言
類型斷言的使用場景是:接口類型的變量可以包含任何類型的值。如何判斷變量的真實類型?
比如解析一個不知道字段類型的 json, 常常需要使用到類型斷言。
可以使用:
ok...idiom
varInterface.(T), varInterface 必須是接口、T 則是具體的實現接口的結構體
switch ..case...
.(type) 只在 switch 語句里才能使用。
以上就是接口的全部內容,接口是go 中最特別的特性。借助 接口, go 實現面向對象中的繼承和多態。
接口是方法的集合,只定義具體要干什么,而怎么干,則由其他的結構體的方法實現。這樣不同的結構體的方法的具體處理不同,實現的接口的功能就不一樣。
盡管如此,接口并不意味著可以隨意濫用。我們最好是根據面向對象的客觀實體,抽象出接口和方法。
本節完,再會。
所謂Go語言式的接口,就是不用顯示聲明類型T實現了接口I,只要類型T的公開方法完全滿足接口I的要求,就可以把類型T的對象用在需要接口I的地方。這種做法的學名叫做Structural Typing,有人也把它看作是一種靜態的Duck Typing。除了Go的接口以外,類似的東西也有比如Scala里的Traits等等。有人覺得這個特性很好,但我個人并不喜歡這種做法,所以在這里談談它的缺點。當然這跟動態語言靜態語言的討論類似,不能簡單粗暴的下一個“好”或“不好”的結論。
我的觀點:
Go的隱式接口Duck Typing確實不是新技術, 但是在主流靜態編程語言中支持Duck Typing應該是很少的(不清楚目前是否只有Go語言支持).
靜態類型和動態類型雖然沒有絕對的好和不好, 但是每個都是有自己的優勢的, 沒有哪一個可以包辦一切. 而Go是試圖結合靜態類型和動態類型(interface)各自的優勢.
那么就從頭談起:什么是接口。其實通俗的講,接口就是一個協議,規定了一組成員,例如.NET里的ICollection接口:
public interface ICollection {
int Count { get; }
object SyncRoot { get; }
bool IsSynchronized { get; }
void CopyTo(Array array, int index);
}
這就是一個協議的全部了嗎?事實并非如此,其實接口還規定了每個行為的“特征”。打個比方,這個接口的Count除了需要返回集合內元素的數目以外,還隱含了它需要在O(1)時間內返回這個要求。這樣一個使用了ICollection接口的方法才能放心地使用Count屬性來獲取集合大小,才能在知道這些特征的情況下選用正確的算法來編寫程序,而不用擔心帶來性能問題,這才能實現所謂的“面向接口編程”。當然這種“特征”并不但指“性能”上的,例如Count還包含了例如“不修改集合內容”這種看似十分自然的隱藏要求,這都是ICollection協議的一部分。
如果說類是對數據和方法的抽象和封裝,那么接口就是對類的抽象。
這里使用Java來說明,Java中的接口與`Go`中的接口是類似的,只不過Java中要顯式的聲明實現某個接口,而Go中不需要顯式的聲明實現了某個接口,只要實現了其中的所有方法,就默認為實現了該接口。
比如說有一個Person接口:
public interface Person{ void walk();
}
有一個Student類實現了Person接口
public class Student implements Person { //實現walk方法
@Override
public void walk(){
System.out.print("Student.walk()");
} //...其他方法}
有一個Teacher類也實現了Person接口
public class Teacher implements Person { //實現walk方法
@Override
public void walk(){
System.out.print("Teacher.walk()");
} //...其他方法}
在某個類中可以這樣使用
public class SomeClass{ //這里接收一個Person類型
public static void usePerson(Person p){
p.walk()
}
public static void main(String[] args){ //可以接收任何實現了Person接口的類的對象
usePerson(new Student());
usePerson(new Teacher());
}
}
使用接口的好處是非常靈活,這樣就與具體的實現做了解耦,如果以后有其他的實現類,只需要實現Person接口就可以了,而不用去改使用的時候的代碼。
新聞名稱:go語言接口原理,go語言接口原理是什么
分享路徑:http://www.yijiale78.com/article34/hsiose.html
成都網站建設公司_創新互聯,為您提供網站收錄、網站改版、動態網站、網站排名、移動網站建設、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯