go slice傳遞給函式過程解析

2021-09-01 00:01:10 字數 1442 閱讀 2366

slice的底層實現是

type intslice struct

這裡的ptr是真實的指向slice的第乙個元素位址的指標。

len表示的是slice當前包含的元素的數目。

cap表示slice的容量。

slice實際上是基於底層陣列實現的,從它的結構體定義中可以得知。

下面講解slice傳入乙個函式時的情況,

看下面的一段**

func

use_array

(args [

]int

)func

main()

var args = arg[1:

5]// [2,3,4,5]

use_array

(args)

fmt.

println

(args)

// [5,3,4,5]

fmt.

println

(arg)

// [1,5,3,4,5,11]

}

list item

為什麼main函式中的args沒有變化?

因為args傳入函式的時候,是按照值傳遞的,main函式中的args和use_array函式中的args並不是同乙個args,use_array中的args是對main函式的args的乙個拷貝,但它底層陣列同樣也是arg,以及ptr指標也指向的是arg的第乙個元素。按值傳遞,main函式的args並不會改變。

func

use_array

(args [

]int

)func

main()

var args = arg[1:

5]// [1,2,3,4]

use_array

(args)

fmt.

println

(args)

// [1,2,3,4]

fmt.

println

(arg)

// [1,5,3,4,5,6]

}

func

use_array

(args *

int)

func

main()

var args = arg[1:

5]fmt.

println

(args)

//[2,3,4,5]

use_array

(&args)

fmt.

println

(args)

//[5,3,4,5,11,10]

fmt.

println

(arg)

//[1,5,3,4,5,6]

}

將陣列傳遞給函式

一維陣列 傳遞陣列給函式的3個原則 1.函式呼叫時只需傳遞陣列名。2.在函式定義中,形參的型別必須與陣列的相同,陣列的大小不必指定。3.函式原型必須定義為引數是乙個陣列。include include voidsort intx,intm intmain printf marks before so...

將函式傳遞給Spark

object myfunctions myrdd.map myfunctions.func1 請注意,雖然也可以在類例項中傳遞對方法的引用 與單例物件相對 但這需要將包含該類的物件與方法一起傳送。例如,考慮 class myclass def dostuff rdd rdd string rdd s...

指標將引數傳遞給函式的過程分析

在mfc框架下,展示了位址傳遞方式參與函式運算的過程。void test int pmn int main 執行結果 atltracegeneral p 0x4febb0 atltracegeneral p 0x4febbc atltracegeneral p 0x14 atltracegenera...