第 19 頁(yè)
在 Go 語(yǔ)言中,所有的變量都以值得方式傳遞。因?yàn)橹羔樧兞康闹凳撬赶虻膬?nèi)存地址扒袖,在函數(shù)間傳遞指針變量,是在傳遞這個(gè)地址值亩码,所以依舊被看作以值得方式在傳遞季率。
第 39 頁(yè)
可以訪問(wèn) http://golang.org/pkg/fmt/ 或者在終端輸入 godoc fmt 來(lái)了解更多關(guān)于 fmt 包的細(xì)節(jié)。
第 40 頁(yè)
使用分布式版本控制系統(tǒng)(Distributed Version Control System描沟,DVCS)來(lái)分享代碼飒泻,如 GitHub、Launchpad 還有 Bitbucket吏廉。Go 語(yǔ)言的工具鏈本身就支持從這些網(wǎng)站及類似網(wǎng)站獲取源代碼泞遗。
第 44 頁(yè)
go vet 命令會(huì)幫開(kāi)發(fā)人員檢測(cè)代碼的常見(jiàn)錯(cuò)誤。
第 46 頁(yè)
Go 語(yǔ)言有兩種方法為開(kāi)發(fā)者生成文檔席覆∈氛蓿可以在終端上直接使用 go doc 命令來(lái)打印文檔∨迳耍可以使用 godoc 程序來(lái)啟動(dòng)一個(gè) Web 服務(wù)器聊倔,通過(guò)點(diǎn)擊的方式來(lái)查看 Go 語(yǔ)言的包的文檔。
go doc tar
godoc -http=:6060(這個(gè)命令通知 godoc 在端口 6060 啟動(dòng) Web 服務(wù)器生巡。如果瀏覽器已經(jīng)打開(kāi)耙蔑,導(dǎo)航到 http://localhost:6060 可以看到一個(gè)頁(yè)面,包含所有 Go 標(biāo)準(zhǔn)庫(kù)和你的 GOPATH 下的 Go 源代碼的文檔)
第 53 頁(yè)
在 Go 語(yǔ)言里孤荣,數(shù)組是一個(gè)長(zhǎng)度固定的數(shù)據(jù)類型甸陌,用于存儲(chǔ)一段具有相同的類型的元素的連續(xù)塊须揣。
因?yàn)槠湔加玫膬?nèi)存是連續(xù)分配的,由于內(nèi)存連續(xù)邀层,CPU 能把正在使用的數(shù)據(jù)緩存更久的時(shí)間返敬。而且內(nèi)存連續(xù)很容易計(jì)算索引,可以快速迭代數(shù)組里的所有元素寥院。數(shù)組的類型信息可以提供每次訪問(wèn)一個(gè)元素時(shí)需要在內(nèi)存中移動(dòng)的距離劲赠。既然數(shù)組的每個(gè)元素類型相同,又是連續(xù)分配秸谢,就可以以固定速度索引數(shù)組中的任意數(shù)據(jù)凛澎,速度非常快估蹄。
第 56 頁(yè)
在 Go 語(yǔ)言里塑煎,數(shù)組是一個(gè)值。這意味著數(shù)組可以用在賦值操作中臭蚁。變量名代表整個(gè)數(shù)組最铁,因此,同樣類型的數(shù)組可以賦值給另一個(gè)數(shù)組垮兑,復(fù)制之后冷尉,兩個(gè)數(shù)組的值完全一樣。
數(shù)組變量的類型包括數(shù)組長(zhǎng)度和每個(gè)元素的類型系枪。只有這兩部分都相同的數(shù)組雀哨,才是類型相同的數(shù)組,才能互相賦值私爷。
復(fù)制指針數(shù)組雾棺,只會(huì)復(fù)制指針的值,而不會(huì)復(fù)制指針?biāo)赶虻闹党幕耄瑥?fù)制之后捌浩,兩個(gè)數(shù)組指向同一組字符串。
第 58 - 62 頁(yè)
數(shù)組本身只有一個(gè)維度嚎卫,不過(guò)可以組合多個(gè)數(shù)組創(chuàng)建多維數(shù)組嘉栓。多維數(shù)組很容易管理具有父子關(guān)系的數(shù)據(jù)或者與坐標(biāo)系相關(guān)聯(lián)的數(shù)據(jù)。
只要類型一致拓诸,就可以將多維數(shù)組互相賦值,多維數(shù)組的類型包括每一維度的長(zhǎng)度以及最終存儲(chǔ)在元素中的數(shù)據(jù)的類型麻昼。
因?yàn)槊總€(gè)數(shù)組都是一個(gè)值奠支,所以可以獨(dú)立復(fù)制某個(gè)維度。
根據(jù)內(nèi)存和性能來(lái)看抚芦,在函數(shù)間傳遞數(shù)組是一個(gè)開(kāi)銷很大的操作倍谜。在函數(shù)之間傳遞變量時(shí)迈螟,總是以值的方式傳遞的。如果這個(gè)變量是一個(gè)數(shù)組尔崔,意味著整個(gè)數(shù)組答毫,不管有多長(zhǎng),都會(huì)完整復(fù)制季春,并傳遞給函數(shù)洗搂。
切片是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)便于使用和管理數(shù)據(jù)集合载弄。切片是圍繞動(dòng)態(tài)數(shù)組的概念構(gòu)建的耘拇,可以按需自動(dòng)增長(zhǎng)和縮小。切片的動(dòng)態(tài)增長(zhǎng)是通過(guò)內(nèi)置函數(shù)append
來(lái)實(shí)現(xiàn)的宇攻。這個(gè)函數(shù)可以快速且高效地增長(zhǎng)切片惫叛。還可以通過(guò)對(duì)切片再次切片來(lái)縮小一個(gè)切片的大小。因?yàn)榍衅牡讓觾?nèi)存也是在連續(xù)塊中分配的逞刷,所有切片還能獲得索引嘉涌、迭代以及為垃圾回收優(yōu)化的好處。
切片有 3 個(gè)字段的數(shù)據(jù)結(jié)構(gòu)夸浅,這些數(shù)據(jù)結(jié)構(gòu)包含 Go 語(yǔ)言需要操作底層數(shù)組的元數(shù)據(jù)仑最。這 3 個(gè)字段分別是指向底層數(shù)組的指針、切片訪問(wèn)的元素的個(gè)數(shù)(即長(zhǎng)度)和切片允許增長(zhǎng)到的元素個(gè)數(shù)(即容量)题篷。
使用內(nèi)置的make
函數(shù)創(chuàng)建切片時(shí)词身,需要傳入一個(gè)參數(shù),指定切片的長(zhǎng)度.如果只指定長(zhǎng)度番枚,那么切片的容量和長(zhǎng)度相等法严。也可以分別制定長(zhǎng)度和容量,創(chuàng)建的切片葫笼,底層數(shù)組的長(zhǎng)度是指定的容量深啤,但是初始化后并不能訪問(wèn)所有的數(shù)組元素。不允許創(chuàng)建容量小于長(zhǎng)度的切片路星,容量小于長(zhǎng)度的切片會(huì)在編譯時(shí)報(bào)錯(cuò)溯街。
如果在[]
運(yùn)算符里指定了一個(gè)值,那么創(chuàng)建的就是數(shù)組而不是切片洋丐。只有不指定值的時(shí)候呈昔,才會(huì)創(chuàng)建切片。
第 64 頁(yè)
切片之所以被稱為切片友绝,是因?yàn)閯?chuàng)建一個(gè)新的切片就是把底層數(shù)組切出一部分堤尾。
第 66 頁(yè)
函數(shù)append
總是會(huì)增加新切片的長(zhǎng)度,而容量有可能會(huì)改變迁客,也可能不會(huì)改變郭宝,這取決于被操作的切片的可用容量辞槐。
第 68 頁(yè)
函數(shù)append
會(huì)智能地處理底層數(shù)組的容量增長(zhǎng)。在切片的容量小于 1000 個(gè)元素時(shí)粘室,總是會(huì)成倍地增加容量榄檬。一旦元素個(gè)數(shù)超過(guò) 1000,容量的增長(zhǎng)因子會(huì)設(shè)為 1.25衔统,也就是會(huì)每次增加 25% 的容量鹿榜。隨著語(yǔ)言的演化,這種增長(zhǎng)算法可能會(huì)有所改變缰冤。
第 75 頁(yè)
在函數(shù)間傳遞切片就是要在函數(shù)間以值的方式傳遞切片犬缨。由于切片的尺寸很小,在函數(shù)間復(fù)制和傳遞切片成本也很低棉浸。
在 64 位架構(gòu)的機(jī)器上怀薛,一個(gè)切片需要 24 字節(jié)的內(nèi)存:指針字段需要 8 字節(jié),長(zhǎng)度和容量字段分別需要 8 字節(jié)迷郑。由于與切片關(guān)聯(lián)的數(shù)據(jù)包含在底層數(shù)組里枝恋,不屬于切片本身,所以將切片復(fù)制到任意函數(shù)的時(shí)候嗡害,對(duì)底層數(shù)組大小都不會(huì)有影響焚碌。復(fù)制時(shí)只會(huì)復(fù)制切片本身,不會(huì)涉及底層數(shù)組霸妹。
第 78 頁(yè)
切片十电、函數(shù)以及包含切片的結(jié)構(gòu)類型這些類型由于具有引用語(yǔ)義,不能作為映射的鍵叹螟,使用這些類型會(huì)造成編譯錯(cuò)誤鹃骂。
第 83 - 84 頁(yè)
Go 語(yǔ)言是一種靜態(tài)類型的編程語(yǔ)言,意味著編譯器需要在編譯時(shí)知曉程序里每個(gè)值的類型罢绽。
值的類型給編譯器提供兩部分信息:一畏线,需要分配多少內(nèi)存給這個(gè)值(即值的規(guī)模);二良价,這段內(nèi)存表示什么寝殴。對(duì)于許多內(nèi)置類型的情況來(lái)說(shuō),規(guī)模和表示是類型名的一部分明垢。int64
類型的值需要 8 字節(jié)(64 位)蚣常,表示一個(gè)整數(shù)值;float32
類型的值需要 4 字節(jié)(32 位)痊银,表示一個(gè) IEEE-754 定義的二進(jìn)制浮點(diǎn)數(shù)史隆;bool
類型的值需要 1 字節(jié)(8 位),表示布爾值 true
和false
曼验。
有些類型的內(nèi)部表示與編譯代碼的機(jī)器的體系結(jié)構(gòu)有關(guān)泌射。例如,根據(jù)編譯所在的機(jī)器的體系結(jié)構(gòu)鬓照,一個(gè) int
值的大小可能是 8 字節(jié)(64 位)熔酷,也可能是 4 字節(jié)(32 位)。還要一些與體系結(jié)構(gòu)相關(guān)的類型豺裆,如 Go 語(yǔ)言里的所有引用類型拒秘。
使用 var
創(chuàng)建一個(gè)變量并初始化其為零值。如果變量被初始化為某個(gè)非零值臭猜,就配合結(jié)構(gòu)字面量和短變量聲明操作符來(lái)創(chuàng)建變量躺酒。
一個(gè)短變量聲明操作符在一次操作中完成兩件事情:聲明一個(gè)變量,并初始化蔑歌。
第 88 頁(yè)
Go 語(yǔ)言里有兩種類型的接收者:值接收者和指針接收者羹应。
第 90 - 92 頁(yè)
Go 語(yǔ)言既允許使用值,也允許使用指針來(lái)調(diào)用方法次屠,不必嚴(yán)格符合接收者的類型园匹。這個(gè)支持非常方便開(kāi)發(fā)者編寫(xiě)程序。
內(nèi)置類型
分別是數(shù)值類型
劫灶、字符串類型
和布爾類型
裸违。這些類型本質(zhì)上是原始的類型。因此本昏,當(dāng)對(duì)這些值進(jìn)行增加或者刪除的時(shí)候供汛,會(huì)創(chuàng)建一個(gè)新值∮磕拢基于這個(gè)結(jié)論怔昨,當(dāng)把這些類型的值傳遞給方法或者函數(shù)時(shí),應(yīng)該傳遞一個(gè)對(duì)應(yīng)值的副本蒲犬。
引用類型
有切片
朱监、映射
、通道
原叮、接口
和函數(shù)類型
赫编。當(dāng)聲明上述類型的變量時(shí),創(chuàng)建的變量被稱為標(biāo)頭
(header)值奋隶。從技術(shù)細(xì)節(jié)上說(shuō)擂送,字符串也是一種引用類型。每個(gè)引用類型創(chuàng)建的標(biāo)頭值是包含一個(gè)指向底層數(shù)據(jù)結(jié)構(gòu)的指針唯欣。每個(gè)引用類型還包含一組獨(dú)特的字段嘹吨,用于管理底層數(shù)據(jù)結(jié)構(gòu)。因?yàn)闃?biāo)頭值是為復(fù)制而設(shè)計(jì)的境氢,所以永遠(yuǎn)不需要共享一個(gè)引用類型的值蟀拷。標(biāo)頭值里包含一個(gè)指針碰纬,因此通過(guò)復(fù)制來(lái)傳遞一個(gè)引用類型的值的副本,本質(zhì)上就是在共享底層數(shù)據(jù)結(jié)構(gòu)问芬。
第 122 頁(yè)
Go 語(yǔ)言里的并發(fā)指的是能讓某個(gè)函數(shù)獨(dú)立于其他函數(shù)運(yùn)行的能力悦析。當(dāng)一個(gè)函數(shù)創(chuàng)建為 goroutine 時(shí),Go 會(huì)將其視為一個(gè)獨(dú)立的工作單元此衅。這個(gè)單元會(huì)被調(diào)度到可用的邏輯處理器上執(zhí)行强戴。Go 語(yǔ)言運(yùn)行時(shí)的調(diào)度器是一個(gè)復(fù)雜的軟件,能管理被創(chuàng)建的所有 goroutine 并為其分配執(zhí)行時(shí)間挡鞍。這個(gè)調(diào)度器在操作系統(tǒng)之上骑歹,將操作系統(tǒng)的線程與語(yǔ)言運(yùn)行時(shí)的邏輯處理器綁定,并在邏輯處理器上運(yùn)行 goroutine墨微。調(diào)度器在任何給定的時(shí)間道媚,都會(huì)全面控制哪個(gè) goroutine 要在哪個(gè)邏輯處理器上運(yùn)行。