Go語言重大部分類型都是基於值語義,包括:
1.基本類型:byte,int,bool,float32,float64,string等;
2.複合類型:數組array,結構體struct,指針pointer等;
重點來了,C/C++中,數組傳遞是引用語義,但在Go中,數組和基本類型沒啥區別,都是值語義,也就是說,Go中的數組傳遞是完全值傳遞;
不理解?看例子!
//C或C++中
int aData[3] = {1,2,3};
auto p = aData; //實際上這裏相當於 int* p = aData
p[1]++; //最終導致 aData = {1, 3, 3}
//Go中
var a = [3]int{1,2,3}
var b = a
b[1]++ // 最終a={1,2,3}並沒有被改變
那麼如何能引用傳遞呢?很簡單,用指針形式,看例子!
//這裏演示數組的引用傳遞
var a=[3]int{1,2,3}
var b = &a // 與上一個例子對比,差別在這裏對 a 取地址,相當於 b 類型爲 *[3]int
b[1]++ //最終會改變a={1,3,3}