zoukankan      html  css  js  c++  java
  • slice 和数组

    数组和slice的区别

    • 声明数组时,方括号内写明了数组的长度或者...,声明slice时候,方括号内为空
    • 作为函数参数时,数组传递的是数组的副本,而slice传递的是指针。

    数组与切片
    数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。数组长度最大为2Gb,它是值类型。切片是对数组一个连续片段的引用,所以切片是一个引用类型。

    按值传递和按引用传递
    Go语言中函数的参数有两种传递方式,按值传递和按引用传递。Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。
    按引用传递其实也可以称作”按值传递”,只不过该副本是一个地址的拷贝,通过它可以修改这个值所指向的地址上的值。
    Go语言中,在函数调用时,引用类型(slice、map、interface、channel)都默认使用引用传递。

    package main
    
    import "fmt"
    
    func main() {
      var slice = make([]int,3,5) //len=3,cap=5
      fmt.Println(slice)
      AddOne(slice)  
      fmt.Println(slice)  
    }
    func AddOne(s []int){
     s[0] = 8888
     fmt.Println(s)
    }
    root@ubuntu:~/go_learn/example.com/hello# ./hello 
    [0 0 0]
    [8888 0 0]
    [8888 0 0]
    package main
    
    import "fmt"
    
    func main() {
      var arr  [3]int   
      fmt.Println(arr)
      AddOne(arr)  
      fmt.Println(arr)  
      fmt.Println("pass point")  
      AddOne_v2(&arr)  
      fmt.Println(arr)  
    }
    func AddOne(arr [3]int){
     arr[0] = 8888
     fmt.Println(arr)
    }
    func AddOne_v2(arr *[3]int){
     arr[0] = 8888
     fmt.Println(arr)
    }
    root@ubuntu:~/go_learn/example.com/hello# ./hello 
    [0 0 0]
    [8888 0 0]
    [0 0 0]
    pass point
    &[8888 0 0]
    [8888 0 0]

    数组传递时的缺点

    一般情况下,传递指针的消耗比传递副本的少,尤其是当数组特别大时。具体原因是:

    值传递需要完整的复制初始数组并将这份拷贝放到栈中,这将耗费大量运行时间,因而值传递方式的效率比较低。
    初始数组的拷贝需要占用额外的内存空间(栈中的内存)
    编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。
    如何避免
    如上面介绍的,有两种方法,第一种利用指针,即引用传递;第二种使用切片,因为切片是引用类型,默认会使用引用传递。

    使用指针进行传递

    package main

    import "fmt"

    func main() {
    var arr = [5]int{1, 2, 3, 4, 5}
    fmt.Println(sum(&arr))
    }

    func sum(arr *[5]int) int {
    s := 0
    for i := 0; i < len(arr); i++ {
    s += arr[i]
    }
    return s

    使用切片进行传递

    package main
    
    import "fmt"
    
    func main() {
    var arr = [5]int{1, 2, 3, 4, 5}
    fmt.Println(sum(arr[:]))
    fmt.Println(arr)
    }
    
    func sum(arr []int) int {
    s := 0
    for i := 0; i < len(arr); i++ {
       s += arr[i]
       arr[i]= arr[i] +1 
    }
    return s
    root@ubuntu:~/go_learn/example.com/hello# go build -o hello .
    root@ubuntu:~/go_learn/example.com/hello# ./hello 
    15
    [2 3 4 5 6]

     
    最后一种方法通常比较常用。

  • 相关阅读:
    rpmdb open failed 的解决办法
    centos7 搭建vsftpd服务并锁定用户的家目录
    centos7 搭建samba服务
    python检测是否为数字
    python的random模块
    利用python编写一个简单的猜数字游戏
    在centos7中利用kvm创建虚拟机并设置为桥接模式
    支付宝提现
    冒泡排序(数组排序)
    全选获取对应值
  • 原文地址:https://www.cnblogs.com/dream397/p/15020724.html
Copyright © 2011-2022 走看看