zoukankan      html  css  js  c++  java
  • go语言切片作为函数参数的研究

    slice作为函数参数是值传递

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

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

    当需要对slice做插入和删除时,由于需要更改长度字段,值拷贝就不行了,需要传slice本身在内存中的地址。

    以删除为例,说明这种情况。

    不通过函数,直接删除slice中的一个元素

    package main
    
    import "fmt"
    
    func main() {
    	si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    	fmt.Printf("%v  len %d 
    ", si, len(si))
        
    	si = append(si[:3],si[4:]...)
        
    	fmt.Printf("%v  len %d 
    ", si, len(si))
    }
    // ---------输出结果-------------------
    [1 2 3 4 5 6 7 8 9]  len 9 
    [1 2 3 5 6 7 8 9]  len 8 
    // --------成功删除了4  长度减1---------
    

    通过函数,参数是slice变量

    func main() {
    	si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    	fmt.Printf("%v  len %d 
    ", si, len(si))
        
    	test1(si)
        
    	fmt.Printf("%v  len %d 
    ", si, len(si))
    }
    
    func test1(si []int) {
    	si = append(si[:3], si[4:]...)
    }
    
    // -------------输出结果-------------------
    [1 2 3 4 5 6 7 8 9]  len 9 
    [1 2 3 5 6 7 8 9 9]  len 9 
    // -----4虽然被删除了,但是长度不变,最后面还多了个9,可见不是想要的结果
    

    通过函数,参数是slice变量的地址

    func main() {
    	si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    	fmt.Printf("%v  len %d 
    ", si, len(si))
        
    	test(&si)
    
    	fmt.Printf("%v  len %d 
    ", si, len(si))
    }
    
    func test(si *[]int) {
    	(*si) = append((*si)[:3], (*si)[4:]...)
    }
    
    
    // ---------输出结果-------------------
    [1 2 3 4 5 6 7 8 9]  len 9 
    [1 2 3 5 6 7 8 9]  len 8 
    // --------成功删除了4  长度减1---------
    
  • 相关阅读:
    浅谈工作流的作用
    WinForm上播放Flash文件
    C#反序列化 “在分析完成之前就遇到流结尾”
    UML类图详解
    关于C#中Thread.Join()的一点理解
    c# 反射的用法
    C#多线程学习笔记之(abort与join配合使用)
    UML用例图总结
    asp.net 发布到IIS中出现”处理程序“PageHandlerFactoryIntegrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”“错误的解决方法
    C#序列化和反序列化
  • 原文地址:https://www.cnblogs.com/endurance9/p/10347336.html
Copyright © 2011-2022 走看看