W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
向新手介紹Go語(yǔ)言時(shí),解釋一下Go中各種類型變量在內(nèi)存中的布局通常有利于幫助他們加深理解。
先看一些基礎(chǔ)的例子:
變量i屬于類型int,在內(nèi)存中用一個(gè)32位字長(zhǎng)(word)表示。(32位內(nèi)存布局方式)
變量j由于做了精確的轉(zhuǎn)換,屬于int32類型。盡管i和j有著相同的內(nèi)存布局,但是它們屬于不同的類型:賦值操作 i = j
是一種類型錯(cuò)誤,必須寫成更精確的轉(zhuǎn)換方式:i = int(j)
。
變量f屬于float類型,Go語(yǔ)言當(dāng)前使用32位浮點(diǎn)型值表示(float32)。它與int32很像,但是內(nèi)部實(shí)現(xiàn)不同。
接下來(lái),變量bytes的類型是[5]byte,一個(gè)由5個(gè)字節(jié)組成的數(shù)組。它的內(nèi)存表示就是連起來(lái)的5個(gè)字節(jié),就像C的數(shù)組。類似地,變量primes是4個(gè)int的數(shù)組。
與C相同而與Java不同的是,Go語(yǔ)言讓程序員決定何時(shí)使用指針。舉例來(lái)說(shuō),這種類型定義:
type Point struct { X, Y int }
先來(lái)定義一個(gè)簡(jiǎn)單的struct類型,名為Point,表示內(nèi)存中兩個(gè)相鄰的整數(shù)。
Point{10,20}
表示一個(gè)已初始化的Point類型。對(duì)它進(jìn)行取地址表示一個(gè)指向剛剛分配和初始化的Point類型的指針。前者在內(nèi)存中是兩個(gè)詞,而后者是一個(gè)指向兩個(gè)詞的指針。
結(jié)構(gòu)體的域在內(nèi)存中是緊挨著排列的。
type Rect1 struct { Min, Max Point }
type Rect2 struct { Min, Max *Point }
Rect1是一個(gè)具有兩個(gè)Point類型屬性的結(jié)構(gòu)體,由在一行的兩個(gè)Point--四個(gè)int代表。Rect2是一個(gè)具有兩個(gè)*Point
類型屬性的結(jié)構(gòu)體,由兩個(gè)*Point表示。
使用過(guò)C的程序員可能對(duì)Point
和*Point
的不同毫不見怪,但用慣Java或Python的程序員們可能就不那么輕松了。Go語(yǔ)言給了程序員基本內(nèi)存層面的控制,由此提供了諸多能力,如控制給定數(shù)據(jù)結(jié)構(gòu)集合的總大小、內(nèi)存分配的次數(shù)、內(nèi)存訪問(wèn)模式以及建立優(yōu)秀系統(tǒng)的所有要點(diǎn)。
有了前面的準(zhǔn)備,我們就可以開始研究更有趣的數(shù)據(jù)類型了。
(灰色的箭頭表示已經(jīng)實(shí)現(xiàn)的但不能直接可見的指針)
字符串在Go語(yǔ)言內(nèi)存模型中用一個(gè)2字長(zhǎng)的數(shù)據(jù)結(jié)構(gòu)表示。它包含一個(gè)指向字符串存儲(chǔ)數(shù)據(jù)的指針和一個(gè)長(zhǎng)度數(shù)據(jù)。因?yàn)閟tring類型是不可變的,對(duì)于多字符串共享同一個(gè)存儲(chǔ)數(shù)據(jù)是安全的。切分操作str[i:j]
會(huì)得到一個(gè)新的2字長(zhǎng)結(jié)構(gòu),一個(gè)可能不同的但仍指向同一個(gè)字節(jié)序列(即上文說(shuō)的存儲(chǔ)數(shù)據(jù))的指針和長(zhǎng)度數(shù)據(jù)。這意味著字符串切分可以在不涉及內(nèi)存分配或復(fù)制操作。這使得字符串切分的效率等同于傳遞下標(biāo)。
(說(shuō)句題外話,在Java和其他語(yǔ)言里有一個(gè)有名的“疑難雜癥”:在你分割字符串并保存時(shí),對(duì)于源字符串的引用在內(nèi)存中仍然保存著完整的原始字符串--即使只有一小部分仍被需要,Go也有這個(gè)“毛病”。另一方面,我們努力但又失敗了的是,讓字符串分割操作變得昂貴--包含一次分配和一次復(fù)制。在大多數(shù)程序中都避免了這么做。)
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)系方式:
更多建議: