W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
原文鏈接:https://gopl-zh.github.io/ch1/ch1-08.html
本章對(duì)Go語言做了一些介紹,Go語言很多方面在有限的篇幅中無法覆蓋到。本節(jié)會(huì)把沒有講到的內(nèi)容也做一些簡(jiǎn)單的介紹,這樣讀者在讀到完整的內(nèi)容之前,可以有個(gè)簡(jiǎn)單的印象。
控制流: 在本章我們只介紹了if控制和for,但是沒有提到switch多路選擇。這里是一個(gè)簡(jiǎn)單的switch的例子:
switch coinflip() {
case "heads":
heads++
case "tails":
tails++
default:
fmt.Println("landed on edge!")
}
在翻轉(zhuǎn)硬幣的時(shí)候,例子里的coinflip函數(shù)返回幾種不同的結(jié)果,每一個(gè)case都會(huì)對(duì)應(yīng)一個(gè)返回結(jié)果,這里需要注意,Go語言并不需要顯式地在每一個(gè)case后寫break,語言默認(rèn)執(zhí)行完case后的邏輯語句會(huì)自動(dòng)退出。當(dāng)然了,如果你想要相鄰的幾個(gè)case都執(zhí)行同一邏輯的話,需要自己顯式地寫上一個(gè)fallthrough語句來覆蓋這種默認(rèn)行為。不過fallthrough語句在一般的程序中很少用到。
Go語言里的switch還可以不帶操作對(duì)象(譯注:switch不帶操作對(duì)象時(shí)默認(rèn)用true值代替,然后將每個(gè)case的表達(dá)式和true值進(jìn)行比較);可以直接羅列多種條件,像其它語言里面的多個(gè)if else一樣,下面是一個(gè)例子:
func Signum(x int) int {
switch {
case x > 0:
return +1
default:
return 0
case x < 0:
return -1
}
}
這種形式叫做無tag switch(tagless switch);這和switch true是等價(jià)的。
像for和if控制語句一樣,switch也可以緊跟一個(gè)簡(jiǎn)短的變量聲明,一個(gè)自增表達(dá)式、賦值語句,或者一個(gè)函數(shù)調(diào)用(譯注:比其它語言豐富)。
break和continue語句會(huì)改變控制流。和其它語言中的break和continue一樣,break會(huì)中斷當(dāng)前的循環(huán),并開始執(zhí)行循環(huán)之后的內(nèi)容,而continue會(huì)跳過當(dāng)前循環(huán),并開始執(zhí)行下一次循環(huán)。這兩個(gè)語句除了可以控制for循環(huán),還可以用來控制switch和select語句(之后會(huì)講到),在1.3節(jié)中我們看到,continue會(huì)跳過內(nèi)層的循環(huán),如果我們想跳過的是更外層的循環(huán)的話,我們可以在相應(yīng)的位置加上label,這樣break和continue就可以根據(jù)我們的想法來continue和break任意循環(huán)。這看起來甚至有點(diǎn)像goto語句的作用了。當(dāng)然,一般程序員也不會(huì)用到這種操作。這兩種行為更多地被用到機(jī)器生成的代碼中。
命名類型: 類型聲明使得我們可以很方便地給一個(gè)特殊類型一個(gè)名字。因?yàn)閟truct類型聲明通常非常地長(zhǎng),所以我們總要給這種struct取一個(gè)名字。本章中就有這樣一個(gè)例子,二維點(diǎn)類型:
type Point struct {
X, Y int
}
var p Point
類型聲明和命名類型會(huì)在第二章中介紹。
指針: Go語言提供了指針。指針是一種直接存儲(chǔ)了變量的內(nèi)存地址的數(shù)據(jù)類型。在其它語言中,比如C語言,指針操作是完全不受約束的。在另外一些語言中,指針一般被處理為“引用”,除了到處傳遞這些指針之外,并不能對(duì)這些指針做太多事情。Go語言在這兩種范圍中取了一種平衡。指針是可見的內(nèi)存地址,&操作符可以返回一個(gè)變量的內(nèi)存地址,并且*操作符可以獲取指針指向的變量?jī)?nèi)容,但是在Go語言里沒有指針運(yùn)算,也就是不能像c語言里可以對(duì)指針進(jìn)行加或減操作。我們會(huì)在2.3.2中進(jìn)行詳細(xì)介紹。
方法和接口: 方法是和命名類型關(guān)聯(lián)的一類函數(shù)。Go語言里比較特殊的是方法可以被關(guān)聯(lián)到任意一種命名類型。在第六章我們會(huì)詳細(xì)地講方法。接口是一種抽象類型,這種類型可以讓我們以同樣的方式來處理不同的固有類型,不用關(guān)心它們的具體實(shí)現(xiàn),而只需要關(guān)注它們提供的方法。第七章中會(huì)詳細(xì)說明這些內(nèi)容。
包(packages): Go語言提供了一些很好用的package,并且這些package是可以擴(kuò)展的。Go語言社區(qū)已經(jīng)創(chuàng)造并且分享了很多很多。所以Go語言編程大多數(shù)情況下就是用已有的package來寫我們自己的代碼。通過這本書,我們會(huì)講解一些重要的標(biāo)準(zhǔn)庫內(nèi)的package,但是還是有很多限于篇幅沒有去說明,因?yàn)槲覀儧]法在這樣的厚度的書里去做一部代碼大全。
在你開始寫一個(gè)新程序之前,最好先去檢查一下是不是已經(jīng)有了現(xiàn)成的庫可以幫助你更高效地完成這件事情。你可以在 https://golang.org/pkg 和 https://godoc.org 中找到標(biāo)準(zhǔn)庫和社區(qū)寫的package。godoc這個(gè)工具可以讓你直接在本地命令行閱讀標(biāo)準(zhǔn)庫的文檔。比如下面這個(gè)例子。
$ go doc http.ListenAndServe
package http // import "net/http"
func ListenAndServe(addr string, handler Handler) error
ListenAndServe listens on the TCP network address addr and then
calls Serve with handler to handle requests on incoming connections.
...
注釋: 我們之前已經(jīng)提到過了在源文件的開頭寫的注釋是這個(gè)源文件的文檔。在每一個(gè)函數(shù)之前寫一個(gè)說明函數(shù)行為的注釋也是一個(gè)好習(xí)慣。這些慣例很重要,因?yàn)檫@些內(nèi)容會(huì)被像godoc這樣的工具檢測(cè)到,并且在執(zhí)行命令時(shí)顯示這些注釋。具體可以參考10.7.4。
多行注釋可以用 /* ... */
來包裹,和其它大多數(shù)語言一樣。在文件一開頭的注釋一般都是這種形式,或者一大段的解釋性的注釋文字也會(huì)被這符號(hào)包住,來避免每一行都需要加//。在注釋中//和/*是沒什么意義的,所以不要在注釋中再嵌入注釋。
![]() |
![]() |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: