首先看一下在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) slicefunc 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利用make+slice弄塊記憶體出來自己管理。。。。這個比較牛逼了doublecap := newcap + newcap
//和old.cap的double進行比較
if cap > doublecap else else
} }
s := make(byte, 200)基於記憶體指標ptr構造出乙個sliceptr := unsafe.pointer(&s[0])
var o byte了解完go對sliceheader := (*reflect.sliceheader)((unsafe.pointer(&o)))
sliceheader.cap = length
sliceheader.len = length
sliceheader.data = uintptr(ptr)
type slice struct
的定義之後,再來理解new和make的差異就簡單得多了。
以下屬宣告的型別為例子,分別用new和make的效果如下圖:
type point structtype 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...