-
go語言是靜態(tài)型和編譯型的語言,使得其運(yùn)行效率很高查看全部
-
與針對字典值的索引表達(dá)式一樣,針對通道值得接受操作也可以有第二個(gè)結(jié)果值。如下: value, ok := <- ch1 這樣做的目的是為了消除與零值有關(guān)的歧義。這里的變量ok的值同樣是bool類型。它代表了通道值得狀態(tài),true代表通道值有效,而false代表通道值已無效(或稱已關(guān)閉)。更深層次的原因是,如果在接收操作進(jìn)行之前或者過程中通道值被關(guān)閉了,則接收操作會立即結(jié)束并返回一個(gè)該通道值得元素類型的零值。按照上面的第一種寫法,我們無從判斷接收零值的原因。 關(guān)閉通道值,調(diào)用內(nèi)建函數(shù)close來達(dá)到目的 :close(ch1) 對通道之的重復(fù)關(guān)閉會引發(fā)運(yùn)行時(shí)恐慌。會使程序崩潰。一定要避免這種情況。另外,在通道值有效的前提下,針對它的發(fā)送操作會在通道值已滿(其中緩存的數(shù)據(jù)的個(gè)數(shù)已等于它的長度)時(shí)被阻塞。想一個(gè)已被關(guān)閉的通道值發(fā)送數(shù)據(jù)會引發(fā)運(yùn)行時(shí)恐慌。另一方面,針對有效通道值的接收操作會在它已空(其中美歐緩存任何數(shù)據(jù))時(shí)被阻塞。 與切片和字典類型相同,通道類型屬于引用類型。它的零值即為nil。查看全部
-
通道值得長度應(yīng)該被成為其緩存的尺寸。它代表著通道值中可以咱村的數(shù)據(jù)的個(gè)數(shù)。暫存在通道值中的數(shù)據(jù)是先進(jìn)先出的,即:越早被放入(或稱發(fā)送)到通道值得數(shù)據(jù)會越先被取出(或接收)。 聲明一個(gè)通道類型的變量,并賦值: ch1 := make(chan string, 5) 我們可以使用接收操作符<-向通道值發(fā)送數(shù)據(jù)。也可以使用它從通道值接收數(shù)據(jù)。如,如果我們要向通道ch1發(fā)送字符串"value1", 那么應(yīng)該這么做: ch1 <- "value1" 另一方面,我們?nèi)粝霃腸h1那里接收字符串,需要:<- ch1 這時(shí),我們可以直接把接收到的字符串賦值給一個(gè)變量,如: value := <- ch1查看全部
-
通道(Channel)是Go語言中一種非常獨(dú)特的數(shù)據(jù)結(jié)構(gòu)。它可用于在不同Goroutine之間傳遞類型化的數(shù)據(jù),并且是并發(fā)安全的。之前的數(shù)據(jù)類型都不是并發(fā)安全的。 Goroutine(Go程序)可被看做是承載可被兵法執(zhí)行的代碼塊的載體。它們由Go語言的運(yùn)行時(shí)系統(tǒng)調(diào)度,并依托操作系統(tǒng)線程(內(nèi)核線程)來并發(fā)的執(zhí)行其中的代碼塊。 表示方法: chan T 解釋:左邊是代表通道類型的關(guān)鍵chan,右側(cè)是一個(gè)可變部分,即代表該通道類型允許傳遞的數(shù)據(jù)的類型(或稱通道的元素類型)。之間需要以空格分隔。 因?yàn)槲覀儫o法表示一個(gè)通道類型的值,因此,無法用字面量來為通道類型的變量賦值。只能通過調(diào)用內(nèi)建函數(shù)make達(dá)到目的。make函數(shù)可接受兩個(gè)參數(shù)。第一個(gè)參數(shù)是代表了將被初始化的值得類型的字面量(比如chan int),而第二個(gè)參數(shù)則是值得長度。例如,若我們想要初始化一個(gè)長度為5且元素類型為int的通道值,需要這么來寫: make(chan int, 5) 實(shí)際上make函數(shù)也可以被用來初始化切片類型或字典類型的值。查看全部
-
解壓:$ sudo tar -zxf go1.9.1.linux-amd64.tar.gz -C /usr/local 測試:$ cd /usr/local/go $ bin/go version 設(shè)置:$ vim /etc/profile # 插入在最后一行 export GOROOT=/usr/local/go export GOPATH=~/golib:~/goproject export GOBIN=~/gobin export PATH=$PATH:$GOROOT/bin:$GOBIN $ source /etc/profile 完成:$ go version查看全部
-
errors.New是一個(gè)很常用的函數(shù)。在Go語言標(biāo)準(zhǔn)庫的代碼包中有很多由此函數(shù)創(chuàng)建出來的錯(cuò)誤值,比如os.ErrPermission、io.EOF等變量的值。我們可以很方便地用操作符==來判斷一個(gè)error類型的值與這些變量的值是否相等,從而來確定錯(cuò)誤的具體類別。就拿io.EOF來說,它代表了一個(gè)信號。該信號用于通知數(shù)據(jù)讀取方已無更多數(shù)據(jù)可讀。我們在得到這樣一個(gè)錯(cuò)誤的時(shí)候不應(yīng)該把它看成一個(gè)真正的錯(cuò)誤,而應(yīng)該只去結(jié)束相應(yīng)的讀取操作。查看全部
-
項(xiàng)目源代碼獲取查看全部
-
1.defer語句僅能被放置在函數(shù)或方法中。它由關(guān)鍵字defer和一個(gè)調(diào)用表達(dá)式組成。 注意,這里的調(diào)用表達(dá)式所表示的既不能是對Go語言內(nèi)建函數(shù)的調(diào)用也不能是對Go語言標(biāo)準(zhǔn)庫代碼包unsafe中的那些函數(shù)的調(diào)用。 2.當(dāng)一個(gè)函數(shù)中存在多個(gè)defer語句時(shí),它們攜帶的表達(dá)式語句的執(zhí)行順序一定是它們的出現(xiàn)順序的倒序。 3.defer攜帶的表達(dá)式語句代表的是對某個(gè)函數(shù)或方法的調(diào)用。這個(gè)調(diào)用可能會有參數(shù)傳入,比如:fmt.Print(i + 1)。 如果代表傳入?yún)?shù)的是一個(gè)表達(dá)式,那么在defer語句被執(zhí)行的時(shí)候該表達(dá)式就會被求值了。 注意,這與被攜帶的表達(dá)式語句的執(zhí)行時(shí)機(jī)是不同的。 4. 如果defer攜帶的表達(dá)式語句代表的是對匿名函數(shù)的調(diào)用,那么我們就一定要非常警惕。查看全部
-
select語句屬于條件分支流程控制方法,不過它只能用于通道。它可以包含若干條case語句,并根據(jù)條件選擇其中的一個(gè)執(zhí)行。進(jìn)一步說,select語句中的case關(guān)鍵字只能后跟用于通道的發(fā)送操作的表達(dá)式以及接收操作的表達(dá)式或語句。示例如下: ch1 := make(chan int, 1) ch2 := make(chan int, 1) // 省略若干條語句 select { case e1 := <-ch1: fmt.Printf("1th case is selected. e1=%v.\n", e1) case e2 := <-ch2: fmt.Printf("2th case is selected. e2=%v.\n", e2) default: fmt.Println("No data!") } ? ? 如果該select語句被執(zhí)行時(shí)通道ch1和ch2中都沒有任何數(shù)據(jù),那么肯定只有default case會被執(zhí)行。但是,只要有一個(gè)通道在當(dāng)時(shí)有數(shù)據(jù)就不會輪到default case執(zhí)行了。顯然,對于包含通道接收操作的case來講,其執(zhí)行條件就是通道中存在數(shù)據(jù)(或者說通道未空)。如果在當(dāng)時(shí)有數(shù)據(jù)的通道多于一個(gè),那么Go語言會通過一種偽隨機(jī)的算法來決定哪一個(gè)case將被執(zhí)行。 ? ? ? ?另一方面,對于包含通道發(fā)送操作的case來講,其執(zhí)行條件就是通道中至少還能緩沖一個(gè)數(shù)據(jù)(或者說通道未滿)。類似的,當(dāng)有多個(gè)case中的通道未滿時(shí),它們會被隨機(jī)選擇。 如果一條select語句中不存在default case, 并且在被執(zhí)行時(shí)其中的所有case都不滿足執(zhí)行條件,那么它的執(zhí)行將會被阻塞!當(dāng)前流程的進(jìn)行也會因此而停滯。直到其中一個(gè)case滿足了執(zhí)行條件,執(zhí)行才會繼續(xù)。我們一直在說case執(zhí)行條件的滿足與否取決于其操作的通道在當(dāng)時(shí)的狀態(tài)。這里特別強(qiáng)調(diào)一點(diǎn),即:未被初始化的通道會使操作它的case永遠(yuǎn)滿足不了執(zhí)行條件。對于針對它的發(fā)送操作和接收操作來說都是如此。 ?? ? ? 最后提一句,break語句也可以被包含在select語句中的case語句中。它的作用是立即結(jié)束當(dāng)前的select語句的執(zhí)行,不論其所屬的case語句中是否還有未被執(zhí)行的語句。查看全部
-
1.只要在panic或其調(diào)用棧之前加上defer ... recover語句就可以了。 2.recover語句所在函數(shù)與panic所在函數(shù)與兩個(gè)函數(shù)之間的函數(shù)都不再往下運(yùn)行。recover語句所在函數(shù)上的函數(shù)繼續(xù)往下運(yùn)行。查看全部
-
defer表達(dá)式在其外函數(shù)運(yùn)行結(jié)束前的最后一刻執(zhí)行。查看全部
-
defer表達(dá)式的參數(shù)表達(dá)式不推遲執(zhí)行。查看全部
-
?for語句代表著循環(huán)。一條語句通常由關(guān)鍵字for、初始化子句、條件表達(dá)式、后置子句和以花括號包裹的代碼塊組成。其中,初始化子句、條件表達(dá)式和后置子句之間需用分號分隔。 ? ? 我們可以省略掉初始化子句、條件表達(dá)式、后置子句中的任何一個(gè)或多個(gè),不過起到分隔作用的分號一般需要被保留下來,除非在僅有條件表達(dá)式或三者全被省略時(shí)分號才可以被一同省略。 ??for語句還有另外一種編寫方式,那就是用range子句替換掉for子句。range子句包含一個(gè)或兩個(gè)迭代變量(用于與迭代出的值綁定)、特殊標(biāo)記:=或=、關(guān)鍵字range以及range表達(dá)式。其中,range表達(dá)式的結(jié)果值的類型應(yīng)該是能夠被迭代的,包括:字符串類型、數(shù)組類型、數(shù)組的指針類型、切片類型、字典類型和通道類型。 ? ? 對于字符串類型的被迭代值來說,for語句每次會迭代出兩個(gè)值。第一個(gè)值代表第二個(gè)值在字符串中的索引,而第二個(gè)值則代表該字符串中的某一個(gè)字符。迭代是以索引遞增的順序進(jìn)行的。 字符串的底層是以字節(jié)數(shù)組的形式存儲的。而在Go語言中,字符串到字節(jié)數(shù)組的轉(zhuǎn)換是通過對其中的每個(gè)字符進(jìn)行UTF-8編碼來完成的。注意,一個(gè)中文字符在經(jīng)過UTF-8編碼之后會表現(xiàn)為三個(gè)字節(jié)。 ? ? 對于數(shù)組值、數(shù)組的指針值和切片之來說,range子句每次也會迭代出兩個(gè)值。其中,第一個(gè)值會是第二個(gè)值在被迭代值中的索引,而第二個(gè)值則是被迭代值中的某一個(gè)元素。同樣的,迭代是以索引遞增的順序進(jìn)行的。 ?? ? ? 對于字典值來說,range子句每次仍然會迭代出兩個(gè)值。顯然,第一個(gè)值是字典中的某一個(gè)鍵,而第二個(gè)值則是該鍵對應(yīng)的那個(gè)值。注意,對字典值上的迭代,Go語言是不保證其順序的。 ?? ? ? 攜帶range子句的for語句還可以應(yīng)用于一個(gè)通道值之上。其作用是不斷地從該通道值中接收數(shù)據(jù),不過每次只會接收一個(gè)值。注意,如果通道值中沒有數(shù)據(jù),那么for語句的執(zhí)行會處于阻塞狀態(tài)。無論怎樣,這樣的循環(huán)會一直進(jìn)行下去。直至該通道值被關(guān)閉,for語句的執(zhí)行才會結(jié)束。 ?? ? ? break語句和continue語句都可以被放置在for語句的代碼塊中。前者被執(zhí)行時(shí)會使其所屬的for語句的執(zhí)行立即結(jié)束,而后者被執(zhí)行時(shí)會使當(dāng)次迭代被中止(當(dāng)次迭代的后續(xù)語句會被忽略)而直接進(jìn)入到下一次迭代。查看全部
-
'a'是int32類型,不是string。查看全部
-
switch語句提供了一個(gè)多分支條件執(zhí)行的方法。在這里用一個(gè)專有名詞來代表分支——case。每一個(gè)case可以攜帶一個(gè)表達(dá)式或一個(gè)類型說明符。前者又可被簡稱為case表達(dá)式。因此,Go語言的switch語句又分為表達(dá)式switch語句和類型switch語句。 ? ? 在表達(dá)式switch語句中,每個(gè)case會攜帶一個(gè)表達(dá)式。與if語句中的條件表達(dá)式不同,這里的case表達(dá)式的結(jié)果類型并不一定是bool。不過,它們的結(jié)果類型需要與switch表達(dá)式的結(jié)果類型一致。所謂switch表達(dá)式是指switch語句中要被判定的那個(gè)表達(dá)式。switch語句會依據(jù)該表達(dá)式的結(jié)果與各個(gè)case表達(dá)式的結(jié)果是否相同來決定執(zhí)行哪個(gè)分支。 switch表達(dá)式必須緊隨switch關(guān)鍵字出現(xiàn)。在后面的花括號中,一個(gè)關(guān)鍵字case、case表達(dá)式、冒號以及后跟的若干條語句組成為一條case語句。在switch語句中可以有若干條case語句。Go語言會依照從上至下的順序?qū)γ恳粭lcase語句中case表達(dá)式進(jìn)行求值。只要被發(fā)現(xiàn)其表達(dá)式與switch表達(dá)式的結(jié)果相同,該case語句就會被選中。它包含的那些語句就會被執(zhí)行。而其余的case語句則會被忽略。 ??switch語句中還可以存在一個(gè)特殊的case——default case。顧名思義,當(dāng)沒有一個(gè)常規(guī)的case被選中的時(shí)候,default?case就會被選中。上面示例中就存在一個(gè)default case。它由關(guān)鍵字default、冒號和后跟的一條語句組成。實(shí)際上,default case不一定被追加在最后。它可以是第一個(gè)case,或者出現(xiàn)在任意順位上。 ??類型switch語句。它與一般形式有兩點(diǎn)差別。第一點(diǎn),緊隨case關(guān)鍵字的不是表達(dá)式,而是類型說明符。類型說明符由若干個(gè)類型字面量組成,且多個(gè)類型字面量之間由英文逗號分隔。第二點(diǎn),它的switch表達(dá)式是非常特殊的。這種特殊的表達(dá)式也起到了類型斷言的作用,但其表現(xiàn)形式很特殊,如:v.(type),其中v必須代表一個(gè)接口類型的值。注意,該類表達(dá)式只能出現(xiàn)在類型switch語句中,且只能充當(dāng)switch表達(dá)式。 fallthrough是一個(gè)關(guān)鍵字,又可以代表一條語句。fallthrough語句可被包含在表達(dá)式switch語句中的case語句中。它的作用是使控制權(quán)流轉(zhuǎn)到下一個(gè)case。查看全部
舉報(bào)
0/150
提交
取消