go切片

1.go切片實現(xiàn)

具體實現(xiàn)請參考下面的文章
Go 切片:用法和本質(zhì)
總結(jié)如下:

  1. 切片可以看做一個結(jié)構(gòu)體,包含len,cap,和指向底層數(shù)組的指針。其中l(wèi)en為切片長度,cap為容量(底層數(shù)組的空間長度)。
  2. 復(fù)制切片的時候,新生成的切片指向的數(shù)組與原有切片相同,第一個元素開始位置和len可能不同。

如s1 := []int{1,2,3}
s2 := s1
s3 := s1[1:]
s1, s2, s3底層指向的數(shù)組相同,只是第一個元素開始位置和len,cap可能不同。

  1. 在上述條件下,修改一個切片元素,會影響其他切片。

2.試驗

package test

import (
    "testing"
    "fmt"
)

func TestSliceChange(t *testing.T) {
    s1 := []int{0, 1, 2, 3}
    s2 := s1
    s2[0] = 7
    fmt.Println(s1, s2)


    s3 := []int{0, 1, 2, 3}
    s4 := chSlice(s3)
    fmt.Println(s3, s4)

    s5 := make([]int, 4, 7)
    s5[0] = 0
    s5[1] = 1
    s5[2] = 2
    s5[3] = 3
    fmt.Println(s5)

    s6 := chSlice(s5)
    fmt.Println(s5, s6)
    fmt.Println(cap(s1), cap(s2), cap(s3), cap(s4), cap(s5), cap(s6))
    s6[1] = 22
    fmt.Println(s5, s6)

    s4[1] = 33
    fmt.Println(s3, s4)
}

func chSlice(s []int) []int {
  s = append(s, 9)
  return s
}

返回結(jié)果如下:

=== RUN   TestSliceChange
[7 1 2 3] [7 1 2 3]
[7 1 2 3] [7 1 2 3 9]
[0 1 2 3]
[7 1 2 3] [7 1 2 3 9]
4 4 4 8 7 7
[7 22 2 3] [7 22 2 3 9]
[7 1 2 3] [7 33 2 3 9]
--- PASS: TestSliceChange (0.00s)
PASS

其中,s3和s4由于執(zhí)行append的時候,發(fā)生了擴容,返回的s4指向了一個新的數(shù)組。所以修改s4元素不會影響s3

切片作為形參

package main

import (
    "fmt"
    "testing"
)

func TestSlice(t *testing.T) {
    s := []int{2,2}
    chSlice(s)
    fmt.Println(s)

    cpSlice(s)
    fmt.Println(s)
}

func chSlice(s []int) {
    s = append(s, 1,1,1,1)
    s[0] = 10
    fmt.Println(s)
}

func cpSlice(s []int) {
    s1 := []int {3,3,3,3}
    copy(s, s1)
}

結(jié)果如下

=== RUN   TestSlice
[10 2 1 1 1 1]
[2 2]
[3 3]
--- PASS: TestSlice (0.00s)
PASS

在函數(shù)中執(zhí)行append不會改變作為形參切片
但是copy函數(shù)可以改變

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 切片slice 本身并不是數(shù)組,它指向底層的數(shù)組 作為變長數(shù)組的替代方案,可關(guān)聯(lián)底層數(shù)組的局部或全部 數(shù)據(jù)類型為引...
    kaxi4it閱讀 537評論 0 0
  • 我們總是喜歡拿“順其自然”來敷衍人生道路上的荊棘坎坷,卻很少承認(rèn),真正的順其自然,其實是竭盡所能之后的不強求,而非...
    喜龍愛慧閱讀 3,462評論 1 1
  • 《青春派》里居然對黃晶晶表白:泰戈爾說,沉默是一種美德。但我覺得在喜歡的人面前,便是懦弱。但是在兵荒馬亂的青春...
    小人物susu閱讀 343評論 0 0
  • 你可能經(jīng)??吹脚笥讶蛞恍┕娞柹虾芏嗪每吹膱D片,趣味的測試、刺激的小游戲…它們可能都是用H5去操作出來的,是不是...
    吳金蘭閱讀 1,420評論 2 0
  • 網(wǎng)上流傳著這樣一個段子,諾貝爾文學(xué)獎獲得者、《蠅王》的作者William Golding曾經(jīng)這樣談?wù)撨^女性: I ...
    海邊的海明威閱讀 1,854評論 0 7

友情鏈接更多精彩內(nèi)容