這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
函數調用時,實參的值會複製到形參。
對於int32,uint64等形如intN,uintN的類型,傳遞的代價是顯而易見的,例如傳遞一個int32需要4個位元組。int和uint是平台相關,均為4位元組(32位)或8位元組(64位),uintptr與任何類型的指標都是4位元組(32位)或8位元組(64位)。float32和float64分別需要4位元組和8位元組,complex64和complex128分別相當於兩個float32和兩個float64。
字串(string)、切片(slice)、介面(interface)、字典(map)、channel不是那麼顯而易見,但通過讓Go產生C庫以便看出一些端倪。
Go產生C庫時會自動產生一個標頭檔(.h),部分內容如下:
typedef struct { char *p; GoInt n; } GoString;typedef void *GoMap;typedef void *GoChan;typedef struct { void *t; void *v; } GoInterface;typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
其中,GoInt在32位和64位下分別相當於(C語言的)int32_t和int64_t,GoUint類似。
由此可見,Go在傳遞字串的時候,傳遞的代價相當於一個指標和一個(Go的)int。當然,如果在函數體中修改了字串形參,Go會為這個字串產生一個(深)拷貝。
傳遞一個map或chan都相當於傳遞了一個指標,所以,傳遞它們的代價是很小的,效能很高的。
傳遞一個interface的代價是兩個指標(可能一個標識類型,一個標識方法集)。
傳遞一個slice的代價是一個指標加兩個(Go的)int。
數組和結構體:
Go的數組是純粹的實值型別,傳遞一個[N]T的代價是N個T。
傳遞一個結構體的代價是每個欄位大小的總和(暫不考慮對齊問題)。