zoukankan      html  css  js  c++  java
  • Go学习3-函数可变参数传参(可变参数函数)

    首先,我目前是C++开发,在自学Go,当然你教他Golang也可以,其实就是Go。然后目前学习的方法就是照着本文最后吗的链接上的教程敲代码,然后思考和c++/python/java/lua有什么不同。虽然学习的很多,但是我不算特别精通,因为实战只用过c++/lua,所以想在这里记录一下。

    今天看到了下面链接里面讲到的函数的可变参数传参,这里不同于c++的可变参数,c++的可变参数是需要通过递归的方式展开的。这里go默认就提供了方法,可以直接解析,也就是,可变参数相当于为参数创建了切片,将切片传入函数。所以函数内如果对于切片进行修改,切片引用的那个数组(那组可变参数)也会发生相应改变。

    最后这里解析一下下面这个例子。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func change(s ...string) {
     8     s[0] = "Go"
     9     s = append(s, "playground")
    10     fmt.Println(s)
    11 }
    12 
    13 func main() {
    14     welcome := []string{"hello", "world"}
    15     change(welcome...)
    16     fmt.Println(welcome)
    17 }

    这里的情况分几部分。分条列出如下:

    1. 第14行welcome是一个切片(切片和数组的区别为数组定长,而切片边长)

    2. 第15行通过...语法糖将welcome这个切片传入change函数,而切片传参时,切片本身做了一次拷贝,即实参和形参的切片并不是同一个切片,只不过他们都引用了同一个数组

    3. 第8行,改变了切片第一个元素"hello"->"Go",相应实参welcome对应的数组里面第一个元素也变成了"Go",所以目前切片welcome为{"Go","world}

    4. 第9行对传入的切片进行了追加操作,根据之前的知识可以得出,追加之后s现在引用的数组容量是原数组的2倍,即容量为4,将原来的数组拷贝到新数组一份,然后追加,所以切片s对应的数组现在是{"Go","world","playground"},而main函数内的引用welcome目前还是第8行中的{"Go","world"}

    5. 所以结果应该是输出了

    [Go,world,playground]
    [Go,world]

    6. 如果读者不知道为什么5中结果是这个,请反复阅读4,并且确认一下切片和数组相关的知识。下面第二个链接里面有详细的切片和数组的知识。

    参考链接:

    可变参数函数 https://studygolang.com/articles/12173

    数组和切片 https://studygolang.com/articles/12121

    可以图形化看到的东西坚决不会用命令行ORZ

  • 相关阅读:
    hdu1852 Beijing 2008
    hdu-2582 f(n)---找规律+素数筛法
    hdu-1452 Happy 2004---因子和+逆元
    LightOJ-1028 Trailing Zeroes (I)---因子数目
    hdu1215 七夕节---因子和
    因子和&&因子数
    hdu-1492 The number of divisors(约数) about Humble Numbers---因子数公式
    hdu-2136 Largest prime factor---巧用素数筛法
    欧拉函数
    BZOJ4418: [Shoi2013]扇形面积并
  • 原文地址:https://www.cnblogs.com/IGNB/p/13019562.html
Copyright © 2011-2022 走看看