1、簡(jiǎn)單易學(xué)。
威遠(yuǎn)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,威遠(yuǎn)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為威遠(yuǎn)上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的威遠(yuǎn)做網(wǎng)站的公司定做!
Go語(yǔ)言的作者本身就很懂C語(yǔ)言,所以同樣Go語(yǔ)言也會(huì)有C語(yǔ)言的基因,所以對(duì)于程序員來(lái)說,Go語(yǔ)言天生就會(huì)讓人很熟悉,容易上手。
2、并發(fā)性好。
Go語(yǔ)言天生支持并發(fā),可以充分利用多核,輕松地使用并發(fā)。 這是Go語(yǔ)言最大的特點(diǎn)。
描述
Go的語(yǔ)法接近C語(yǔ)言,但對(duì)于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進(jìn)程(CSP)為基礎(chǔ),采取類似模型的其他語(yǔ)言包括Occam和Limbo,但它也具有Pi運(yùn)算的特征,比如通道傳輸。
在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go中動(dòng)態(tài)加載部分函數(shù)。
與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 切片(Slice) 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語(yǔ)言級(jí)支持。
大家好,我是謝偉,是一名程序員。
下面的學(xué)習(xí)是一個(gè)系列,力求從初學(xué)者的角度學(xué)會(huì)go 語(yǔ)言,達(dá)到中級(jí)程序員水平。
這一系列是我的輸出總結(jié),同時(shí)我還推出了視頻版。正在制作過程。
為寫出這些文章,我閱讀了網(wǎng)上諸多熱門的教程和紙質(zhì)書籍。內(nèi)容的實(shí)質(zhì)都是那些,要區(qū)分出差異的話,只能表現(xiàn)在具體實(shí)例層面。所以,實(shí)例我會(huì)選取自己在工作中的項(xiàng)目實(shí)例抽取出來(lái)。希望對(duì)大家有所幫助。
我們已經(jīng)研究了:
本節(jié)的主題是:接口
接口是 golang 中最值得強(qiáng)調(diào)的特性。它讓面向?qū)ο螅瑑?nèi)容組織實(shí)現(xiàn)非常的方便。
接口在 go 語(yǔ)言中是一系列方法的集合,原則上方法可以有很多個(gè),但建議4個(gè)左右。
上文中定義了一個(gè) httpClient 的接口,指定了這個(gè)接口可以干這些活: Get、Post、Put、Delete
上文中指定了 httpClient 接口,指定了這個(gè)接口需要干的活是: Get、Post、Put、Delete , 具體的實(shí)現(xiàn)需要靠其他結(jié)構(gòu)體來(lái)實(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è)讀寫接口在好些庫(kù)中實(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 語(yǔ)句里才能使用。
以上就是接口的全部?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ì)。
如果說類是對(duì)數(shù)據(jù)和方法的抽象和封裝,那么接口就是對(duì)類的抽象。
這里使用Java來(lái)說明,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í)候的代碼。
1. 保留但大幅度簡(jiǎn)化指針
Go語(yǔ)言保留著C中值和指針的區(qū)別,但是對(duì)于指針繁瑣用法進(jìn)行了大量的簡(jiǎn)化,引入引用的概念。所以在Go語(yǔ)言中,你幾乎不用擔(dān)心會(huì)因?yàn)橹苯硬僮鲀?nèi)寸而引起各式各樣的錯(cuò)誤。
2. 多參數(shù)返回
還記得在C里面為了回饋多個(gè)參數(shù),不得不開辟幾段指針傳到目標(biāo)函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無(wú)需使用繁瑣的exceptions體系,一個(gè)函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯(cuò)誤信息,清晰明了。
3. Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)
如果你習(xí)慣了Python中簡(jiǎn)潔的list和dict操作,在Go語(yǔ)言中,你不會(huì)感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會(huì)發(fā)現(xiàn)你又找到了STL的vector 和 map這對(duì)朋友。
4. Interface
Go語(yǔ)言最讓人贊嘆不易的特性,就是interface的設(shè)計(jì)。任何數(shù)據(jù)結(jié)構(gòu),只要實(shí)現(xiàn)了interface所定義的函數(shù),自動(dòng)就implement了這個(gè)interface,沒有像Java那樣冗長(zhǎng)的class申明,提供了靈活太多的設(shè)計(jì)度和OO抽象度,讓你的代碼也非常干凈。千萬(wàn)不要以為你習(xí)慣了Java那種一條一條加implements的方式,感覺還行,等接口的設(shè)計(jì)越來(lái)越復(fù)雜的時(shí)候,無(wú)數(shù)Bug正在后面等著你。
同時(shí),正因?yàn)槿绱?,Go語(yǔ)言的interface可以用來(lái)表示任何generic的東西,比如一個(gè)空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類型,因?yàn)檫@些數(shù)據(jù)類型都不需要實(shí)現(xiàn)任何函數(shù),自然就滿足空interface的定義了。加上Go語(yǔ)言的type assertion,可以提供一般動(dòng)態(tài)語(yǔ)言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯(cuò)誤。
5. OO
Go語(yǔ)言本質(zhì)上不是面向?qū)ο笳Z(yǔ)言,它還是過程化的。但是,在Go語(yǔ)言中, 你可以很輕易的做大部分你在別的OO語(yǔ)言中能做的事,用更簡(jiǎn)單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因?yàn)楸举|(zhì)上,OO在Go語(yǔ)言中,就是普通的struct操作。
6. Goroutine
這個(gè)幾乎算是Go語(yǔ)言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級(jí)輕量級(jí)的類似線程的東西,但通過它,你不需要復(fù)雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Go語(yǔ)言里,觸發(fā)一個(gè)routine和erlang spawn一樣簡(jiǎn)單?;旧弦莆誈o語(yǔ)言,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過請(qǐng)放心,真的非常簡(jiǎn)單。
7. 更多現(xiàn)代的特性
和C比較,Go語(yǔ)言完全就是一門現(xiàn)代化語(yǔ)言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。
看到這里,你可能會(huì)發(fā)現(xiàn),我用了很多輕易,簡(jiǎn)單,快速之類的形容詞來(lái)形容Go語(yǔ)言的特點(diǎn)。我想說的是,一點(diǎn)都不夸張,連Go語(yǔ)言的入門學(xué)習(xí)到提高,都比別的語(yǔ)言門檻低太多太多。在大部分人都有C的背景的時(shí)代,對(duì)于Go語(yǔ)言,從入門到能夠上手做項(xiàng)目,最多不過半個(gè)月。Go語(yǔ)言給人的感覺就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。