Go学习--函数

1、函数重载:

指的是可以编写多个同名函数,只要它们拥有不同的形参与/或者不同的返回值,在 Go 里面函数重载是不被允许的。

funcName redeclaredinthisbook, previous declaration at lineno

2、申明外部函数:

func  flushICache(begin,  end uintptr)           // implemented externally

ep:

func  make(Type,sizeIntegerType) Type  //来自Go源码builtin.go

3、没有参数的函数通常被称为niladic函数(niladic function),就像main.main()。

4、传参方式:

    1)按值传递:Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量。Function(arg1)

    2)按引用传递:传递的是一个地址的副本,但是该地址副本和原地址指向的都是同一块内存,所以通过这个地址副本可以影响内存中的内容。Function(&arg1)

5、命名的返回值(推荐方式):

func A(input int) (x2 int, x3 int) {    

     x2 =2* input   

     x3 =3* input

     // return x2, x3

     return

}

6、空白符:

func ThreeValues() (a int, b int, c float32)  {

    a, b, c = 5, 6, 7

    return

}

a,_,c :=ThreeValues()  //这样就忽略了参数b。

7、传递变长参数:

func  myFunc(a,  b string,  elems ...int)  { 

    fmt.Printf("%T  ",elems)  //[]int , 即:elems是一个切片类型

    fmt.Println(a, b, elems)  //lxc zhuoer [1 2 3 4 5 6]

 }

myFunc("lxc", "zhuoer", 1,2,3,4,5,6) 

注意: elems如果是放在一个切片(sl)中要传递过来的话, 则可以使用 sl... 方式来传递。

sl := []int{1,2,3,4,5,6};

myFunc("lxc","zhuoer", sl... )

8、defer:

作用:允许我们推迟到函数返回之前(或任意位置执行return语句之后)一刻才执行某个语句或函数。

func A () { 

    fmt.Println("AAAAAAA")

    defer  fmt.Println("BBBBBBBB")

    fmt.Println("CCCCCCC")

}

输出:

AAAAAAAA

CCCCCCC

BBBBBBBB

特别注意:

for i :=0; i <4; i++ {

    defer func() {

        fmt.Print(i) 

    }()

}

输出:

4444  //个人理解:defer 只是暂时注册了这些匿名函数,并没有执行匿名函数的函数体,所以fmt.Println(i)这条语句没有执行,所以也就没有发生值拷贝,当真正需要执行的时候,i已经变为4了,此时发生的值拷贝也是拷贝的4.

for i :=0; i <4; i++ {

    defer fmt.Print(i)

}

输出:

3210

9、计算函数执行的时间:

start := time.Now()

longCalculation()

end := time.Now()

delta := end.Sub(start)   //delta执行时间,毫秒

你可能感兴趣的:(Go学习--函数)