slice切片做函数参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了slice切片做函数参数相关的知识,希望对你有一定的参考价值。

参考技术A         再来分析一下golang中的切片slice底层的实现细节。

slice通过数组实现,类似一个结构体,其中一个字段保存的是底层数组的地址,还有长度(len) 和 容量(cap)两个字段。

        我们都知道,结构体作为函数参数时是值拷贝,同理,实际上slice作为函数参数时也是值拷贝,在函数中对slice的修改是通过slice中保存的地址对底层数组进行修改,所以函数外的silce看起来被改变了。

        当需要对slice做插入和删除时(如:append操作),由于需要更改slice结构体中的长度字段,值拷贝就行不通了,需要传slice本身在内存中的地址。

看一个值传递的例子:

```

package main

import "fmt"

func processSlice(x []int)

    x = append(x, 6)



func main()

    var numbers = []int1, 2, 3, 4, 5

    processSlice(numbers)

    for _, v := range(numbers)

        fmt.Println(v)

    



```

>>> 1 2 3 4 5

再看一个指针传递的例子:

```

package main

import "fmt"

func processSlice(x *[]int)

    *x = append(*x, 6)



func main()

    var numbers = []int1, 2, 3, 4, 5

    processSlice(&numbers)

    for _, v := range(numbers)

        fmt.Println(v)

    



```

>>> 1 2 3 4 5 6

slice for 循环中删除元素

方法1:

```

chars:=[]string"a","a","b"

fori:=0;i<len(chars);i++

    if chars[i]=="a"

        chars=append(chars[:i],chars[i+1:]...)

        i--// form the remove item index to start iterate next item





fmt.Printf("%+v",chars)

```

方式2:

```

p := []int1, -13, 9, 6, -21, 125

j := 0

for _, n := range p

    if n > 0

        p[j] = n   //删除小于零的元素

        j++

    



```

不改原slice

```

p := []int1, -13, 9, 6, -21, 125

j := 0

q := make([]int, len(p))

for _, n := range p

    if n > 0

        q[j] = n   //删除小于零的元素

        j++

    



q = q[:j]

```

以上是关于slice切片做函数参数的主要内容,如果未能解决你的问题,请参考以下文章

Go杂记1-切片Slice作为函数参数那点事儿

Go杂记1-切片Slice作为函数参数那点事儿

Go杂记1-切片Slice作为函数参数那点事儿

golang-101-hacks(12)——切片作为函数参数传递

golang学习五·五:指针&切片&字典&结构体

golang学习五·五:指针&切片&字典&结构体