Go 語言陣列作為引數傳遞時為什麼要用值傳遞?

時間 2021-10-23 01:31:48

1樓:瀟灑哥和黑大帥

首先明確一點,指標傳遞(引用傳遞)不一定比值傳遞效率高,原因如下:

如果存在引用,經過逃逸分析會放在堆上。

而如果陣列只是拷貝,經過逃逸分析會放在棧上。

棧上分配記憶體比在堆中分配記憶體有更高的效率。

棧上分配的記憶體不需要GC處理。

堆上分配的記憶體使用完畢會交給GC處理。

逃逸分析目的是決定內分配位址是棧還是堆,逃逸分析在編譯階段完成。

所以思考一下這個問題:函式傳遞指標真的比傳值效率高嗎? 我們知道傳遞指標可以減少底層值的拷貝,可以提高效率,但是如果拷貝的資料量小,由於指標傳遞會產生逃逸,可能會使用堆,也可能會增加GC的負擔,所以傳遞指標不一定是高效的。

2樓:哲宇

布林型別的變數值有兩種:真(true), 假 (false), 用 bool 關鍵字來進行定義。 布林型別主要用於後面講解的條件判斷,Go語言中不允許將整型強制轉換為布林型。

布林型無法參與數值運算,也無法與其他型別進行轉換。

Go語言同時提供了有符號無符號的整數型別,其中包括int8、int16、int32 和 int64四種大小截然不同的有符號整數型別,分別對應 **8、16、32、64 bit(二進位制位)**大小的有符號整數,與此對應的是uint8、uint16、uint32 和 uint64四種無符號整數型別。

此外還有兩種整數型別int 和 uint,它們分別對應特定 CPU 平台的字長(機器字大小),其中 int 表示有符號整數,應用最為廣泛,uint 表示無符號整數。實際開發中由於編譯器和計算機硬體的不同,int 和 uint 所能表示的整數大小會在 32bit 或 64bit 之間變化。

大多數情況下,我們只需要 int 一種整型即可,它可以用於迴圈計數器(for 迴圈中控制迴圈次數的變數)、陣列和切片的索引,以及任何通用目的的整型運算子,通常 int 型別的處理速度也是最快的。

程式邏輯對整型範圍沒有特殊需求。例如,物件的長度使用內建 len() 函式返回,這個長度可以根據不同平台的位元組長度進行變化。實際使用中,切片或 map 的元素數量等都可以用 int 來表示。

反之,在二進位制傳輸、讀寫檔案的結構描述時,為了保持檔案的結構不會受到不同編譯目標平台位元組長度的影響,不要使用 int 和 uint。

Go語言提供了兩種精度的浮點數 float32 和 float64。

乙個 float32 型別的浮點數可以提供大約 6 個十進位制數的精度,而 float64 則可以提供約 15 個十進位制數的精度,通常應該優先使用 float64 型別,因為 float32 型別的累計計算誤差很容易擴散,並且 float32 能精確表示的正整數並不是很大。

浮點數在宣告的時候可以只寫整數部分或者小數部分:

const e = .71828 // 0.71828

const f = 1. // 1

定義字串,可以使用雙引號""來定義字串

package main

import (

"fmt"

)func main()

字串的內容(純位元組)可以通過標準索引法來獲取,在方括號內寫入索引,索引從 0 開始計數:

字串 str 的第 1 個位元組:str[0]

第 i 個位元組:str[i - 1]

最後 1 個位元組:str[len(str)-1]

字串拼接符「+」,也可以使用「+=」來對字串進行拼接:

s := "hel" + "lo,"

s += "world!"

fmt.Println(s) //輸出 「hello, world!」

Go語言的字元有以下兩種:

uint8 型別,或者叫 byte 型,代表了 ASCII 碼的乙個字元。

rune 型別,代表乙個 UTF-8 字元,當需要處理中文、日文或者其他復合字元時,則需要用到 rune 型別。rune 型別等價於 int32 型別。

Go 語言陣列被設計成值型別有什麼用呢?

青青青 Go 語言提供了陣列型別的資料結構。陣列是具有相同唯一型別的一組已編號且長度固定的資料項序列,這種型別可以是任意的原始型別例如整型 字串或者自定義型別。相對於去宣告number0,number1,number99的變數,使用陣列形式numbers 0 numbers 1 numbers 99...

為什麼GO語言的效能還不如C

你不能用這麼粗暴的用 for 迴圈來測試效能,然後下論斷,而且你 Golang 和 C 的版本 執行環境都沒有說,Golang 這幾年提公升很大的。最後.題主建立 map 的時候都沒有設定 capacity,建議設定一下再看,go 這樣不設定的話挺影響效能的。 gao xinge 雖說比較語言效能招...

C 模板引用引數傳遞的問題,為什麼沒有優先匹配基類的引用型別?

少年之翼 對於函式過載,標準定義了複雜的判定規則 在多引數的情況下可能會複雜到肉眼難以分辨的程度 認為 優先匹配基類的引用引數 是太天真了。簡單理解就是乙個匹配要明顯優於其他才算作成功,否則就會被認為優勢太小不足以區分,故編譯不過。運算子的版本能夠通過 運算子也是函式呼叫,需要經過函式過載決議選定 ...