Go語(yǔ)言 基本類型

2020-06-01 10:57 更新

向新手介紹Go語(yǔ)言時(shí),解釋一下Go中各種類型變量在內(nèi)存中的布局通常有利于幫助他們加深理解。

先看一些基礎(chǔ)的例子:

godata1

變量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ù)組。

結(jié)構(gòu)體和指針

與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ù)程序中都避免了這么做。)

links


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)