• go slice和数组的区别


    1.使用方式

    数组和slice长的很像,操作方式也都差不多,并且slice包含了数组的基本的操作方式,如下标、range循环,还有一些如len()则是多种类型共用,所以根据操作根本搞不清数组和切片的区别,能够看出区别的地方主要看如何声明的。

    数组的声明方式很单一,通常就是下面这样:

    array1 := [5]int{1, 2, 3, 4, 5}
    array2 := [5]int{}

    slice的声明方式就非常多样了,如前面介绍的几种:

    var slice1 = []int{1, 2, 3, 4, 5}
    var slice2 = make([]int, 0, 5)
    var slice3 = make([]int, 5, 5)
    var slice4 = make([]int, 5)

    加上对数组的切片和append操作都会产生数组切片(slice)

    2.值传递or引用传递

    func arrayModify(array [5]int) {
        newArray := array
        newArray[0] = 88
    }
    func sliceModify(slice []int) {
        newSlice := slice
        newSlice[0] = 88
    }
    func main() {
        array := [5]int{1, 2, 3, 4, 5}
        slice := []int{1, 2, 3, 4, 5}
        arrayModify(array)
        sliceModify(slice)
        fmt.Println(array)
        fmt.Println(slice)
    }

    输出

    [1 2 3 4 5]
    [88 2 3 4 5]

    其实不只是数组,go语言中的大多数类型在函数中当作参数传递都是值语义的。也就是任何值语义的一种类型当作参数传递到调用的函数中,都会经过一次内容的copy,从一个方法栈中copy到另一个方法栈。这对于熟练java的同学需要进行一次彻底的观念转变,在java中除了少数的值类型是按照值传递,所有的类在函数传递时都是具有引用语义的,也就是通过指针传递。所以在使用时传递对象,不需要去分别值和引用。

    go说到底不是一种纯粹的面向对象的语言,更多的是一种更简单高效的C,所以在参数传递上跟C保持着基本的一致性。一些较大的数据类型,比如结构体、数组等,最好使用传递指针的方式,这样就能避免在函数传递时对数据的copy。

    虽然slice在传递时是按照引用语义传递,但是又因为append()操作的问题,导致即使是引用传递还是不能顺利解决一些问题,后面一篇文章将说明一下如何解决递归函数中传递slice的问题:

     

    go递归函数如何传递数组切片slice

  • 相关阅读:
    Help document of CAD Build
    NSTableView 中 NSTextField无法输入
    NSScrollView 内容显示不正常问题
    Mac 中 NSTrackingArea 鼠标移动事件捕获
    java定时任务调度框架
    uboot: initramfs image to roofs, and rootfs to initramfs image
    jfrog CLI(command line interface)
    git submodule list/clone/update
    python run javascript in ubuntu
    git blame
  • 原文地址:https://www.cnblogs.com/mahang/p/3273675.html
Copyright © 2020-2023  润新知