Go語言 基本型別

2022-07-18 07:03:12 字數 2199 閱讀 4195

首先看一下在go中,一些基礎型別在記憶體中是以什麼形態存在的,如下圖所示:

變數j的型別是int32, 而變數i的型別是int,兩者不是同乙個型別,所以賦值操作i=j是一種型別錯誤cannot use j (type int32) as type int in assignment

正確的方式應該是

i := int(7)

j := int32(7)

i = int(j)

結構體的域在記憶體中是緊密排列的。

byte是go的靜態型別,uint8是go的底層型別

rune是int32的別名,用於表示unicode字元。通常在處理中文的時候需要用到它

定義在go-1.8.3/go/src/runtime/string.go

type stringstruct struct 

兩個屬性:乙個指標,乙個int型的長度,都是私有成員!

string型別型別在go語言的記憶體模型中用乙個2字長的資料結構表示。 從上圖可以看出,其實多個string是共享乙個儲存的。

str[i:j]進行字串切片操作,會得到乙個新的type stringstruct struct物件,該物件的指標依然還是指向str的底層儲存,長度為j-i。 這說明字串切分不涉及記憶體分配或複製操作,其效率等同於傳遞下標。

內建函式len()對string型別的操作是直接從底層結構中取出len值,而不需要額外的操作

定義在/go-1.8.3/src/runtime/slice.go

type slice struct 

顯然,type slice struct和上面的type stringstruct struct很類似,只是多了乙個cap屬性。

乙個slice是乙個底層陣列的部分引用。同理,對底層資料進行切片操作也不會涉及到記憶體分配或複製操作,僅僅是新建了乙個type slice struct物件而已!

需要注意的是,在上圖中,y[0:4]是有效的,列印出來的結果會是[3,5,7,11]

由於slice是不同於指標的多字長結構,分割操作並不需要分配記憶體,甚至沒有通常被儲存在堆中的slice頭部。這種表示方法使slice操作和在c中傳遞指標、長度對一樣廉價。

slice相關的函式有如下幾個,是不是感覺很熟悉。

func makeslice(et *_type, len64, cap64 int64) slice

func growslice(et *_type, old slice, cap int) slice

func slicecopy(to, fm slice, width uintptr) int

func slicestringcopy(to byte, fm string) int

newcap := old.cap

doublecap := newcap + newcap

//和old.cap的double進行比較

if cap > doublecap else else

} }

利用make+slice弄塊記憶體出來自己管理。。。。這個比較牛逼了

s := make(byte, 200)

ptr := unsafe.pointer(&s[0])

基於記憶體指標ptr構造出乙個slice

var o byte

sliceheader := (*reflect.sliceheader)((unsafe.pointer(&o)))

sliceheader.cap = length

sliceheader.len = length

sliceheader.data = uintptr(ptr)

了解完go對type slice struct的定義之後,再來理解new和make的差異就簡單得多了。

以下屬宣告的型別為例子,分別用new和make的效果如下圖:

type point struct 

type rect1 struct

type rect2 struct

原文: 

Go語言 基本型別

int int8 int16 int32 int64 表示不同長度的整數 uint uint8 uint16 uint32 uint64 表示不同長度的無符號整數 uintptr 表示乙個用來儲存指標位址的整數 uintptr只是儲存位址的值,不能直接進行指標操作 float32 float64 浮...

Go 基本型別

標準整形是按長度進行分類的,其中uint8為byte型,int16為c語言中的short型,int64為c語言中的long型別。型別描述 uint8 無符號 8位整型 0 到 255 uint16 無符號 16位整型 0 到 65535 uint32 無符號 32位整型 0 到 4294967295...

go 基本型別

go有許多預定義型別,這裡簡單把它們分為基本型別和高階型別。下面是基本型別列表 go的基本型別共有18個,其中int和uint的實際寬度會根據計算架構的不同而不同。在386計算架構下,它的寬度為32位元,即4個位元組。在amd64計算架構下,它們的寬度為64位元,即8個位元組。byte型別可以看作u...