golang學習筆記 slice

2022-04-11 08:52:13 字數 3726 閱讀 6184

go 語言中的slice型別可以理解為是陣列array型別的描述符,包含了三個因素:

指向底層陣列的指標 

slice目前使用到的底層陣列的元素個數,即長度

底層陣列的最大長度,即容量

因此當我們定義乙個切片變數,s := make(int, 5, 10),即為指向了乙個最大長度為10的底層陣列,目前切片s使用到的長度為5。 

基於slice的定義,在使用slice時,有以下幾點注意事項:

1.對slice進行切分操作

對slice進行切分操作會生成乙個新的slice變數,新slice和原來的slice指向同乙個底層陣列,只不過指向的起始位置可能不同,長度及容量可能也不相同。

package main

import (

"fmt"

)func main()

輸出:

b--  len: 3  ,cap: 10

c-- len: 2 ,cap: 8

d-- len: 10 ,cap: 10

2.slice的賦值及函式間傳遞

a := int

b := a

package main

import (

"fmt"

)func main()

b := a

//對b進行操作會影響到a

b[0] = 10

// 10 2 3 4 5

fmt.println(a)

}

輸出:

[10 2 3 4 5]

如上所示,則a, b指向同乙個底層陣列,且長度及容量因素相同,對b進行的操作會影響到a。 

切片作為函式引數示例:

package main

import (

"fmt"

)func modifyslice(s int)

func main()

modifyslice(a)

//[10 2 3 4 5]

fmt.println(a)

}

輸出:

[10 2 3 4 5]

如上所示,將slice作為引數在函式間傳遞的時候是值傳遞,產生了乙個新的slice,只不過新的slice仍然指向原來的底層陣列,所以通過新的slice也能改變原來的slice的值 

package main

import (

"fmt"

)func modifyslice(s int)

s[0] = -1

}func main()

modifyslice(a)

//[1 2 3 4 5]

fmt.println(a)

}

如上所示,在呼叫函式的內部,將s整體賦值乙個新的slice,並不會改變a的值,因為modifyslice函式內對s重新的整體賦值,讓s指向了乙個新的底層陣列,而不是傳遞進來之前的a指向的那個陣列,之後s的任何操作都不會影響到a了。

package main

import (

"fmt"

)func main()

輸出:

initialize.....

a: [0 0] &a[0]: 0xc0000105a0 len: 2 cap: 4

賦值之後.....

a: [99 0] &a[0]: 0xc0000105a0 len: 2 cap: 4

a: [1 0] &a[0]: 0xc0000105a0 len: 2 cap: 4

b: [1 0 2] &b[0]: 0xc0000105a0 len: 3 cap: 4

a: [1 0 3] &a[0]: 0xc0000105a0 len: 3 cap: 4

b: [1 0 3] &b[0]: 0xc0000105a0 len: 3 cap: 4

a: [1 0 3 4 5] &a[0]: 0xc000014240 len: 5 cap: 8

b: [1 0 3] &b[0]: 0xc0000105a0 len: 3 cap: 4

package main

import (

"fmt"

)func main()

輸出:

a: [10 20]  &a[0]: 0xc0000105a0  len: 2  cap: 4

a: [10 1] &a[0]: 0xc0000105a0 len: 2 cap: 4

b: [10 1] &b[0]: 0xc0000105a0 len: 2 cap: 4

package main

import (

"fmt"

)func main()

輸出:

a: [10 20]  &a[0]: 0xc000072140  len: 2  cap: 4

c: [10] &c[0]: 0xc000072140 len: 1 cap: 4

a: [10 1] &a[0]: 0xc000072140 len: 2 cap: 4

b: [10 1] &b[0]: 0xc000072140 len: 2 cap: 4

package main

import (

"fmt"

)func main()

輸出:

a: [10 20]  &a[0]: 0xc0000105a0  len: 2  cap: 4

a: [10 20] &a[0]: 0xc0000105a0 len: 2 cap: 4

b: [10 1 2 3 4] &b[0]: 0xc000014240 len: 5 cap: 8

package main

import (

"fmt"

) //s: [10 1] &s[0]: 0x10410020 len: 2 cap: 4

fmt.println("s:", s, " &s[0]:", &s[0], " len:", len(s), " cap:", cap(s))

}func main()

輸出:

a: [10 20]  &a[0]: 0xc0000105a0  len: 2  cap: 4

s: [10 1] &s[0]: 0xc0000105a0 len: 2 cap: 4

a: [10 1] &a[0]: 0xc0000105a0 len: 2 cap: 4

import (

"fmt"

) //s: [10 1] &s[0]: 0x10410020 len: 2 cap: 4

fmt.println("s:", s, " &s[0]:", &s[0], " len:", len(s), " cap:", cap(s))

}func main()

輸出

a: [10 20] &a[0]: 0xc0000105a0 len: 2 cap: 4

s: [10 1 2 3 4] &s[0]: 0xc000014240 len: 5 cap: 8

a: [10 20] &a[0]: 0xc0000105a0 len: 2 cap: 4

參考:

golang學習筆記 slice 2

array是固定長度的陣列,slice是對array的擴充套件,本質上是基於陣列實現的,主要特點是定義完乙個slice變數之後,不需要為它的容量而擔心。array與slice的差別 1 array是固定長度,slice是可變長度 2 array是值型別,slice是引用型別 slice 結構 typ...

golang筆記 Slice切片

sliceslice代表變長的序列,序列中每個元素都有相同的型別。語法和陣列很像,只是沒有固定長度。引用型別 動態陣列 從概念上來說,slice像乙個結構體,這個結構體包含了三個元素 乙個指標,指向陣列中slice指定的開始位置 長度,即slice的長度 最大長度,也就是slice開始位置到陣列的最...

golang學習(九) 切片(slice)

在go 語言中,陣列是值型別,長度是固定的 而切片是引用型別,長度可動態增長。切片的內部結構包括位址 大小和容量。特性 1.當省略開始位置時,表示從連續區域開頭到結束位置。2.當省略結束位置時,表示從開始位置到整個連續區域結束位置。3.兩者都省略時,與切片本身等效。基本格式如下 slice 開始位置...