函数是组织好的,可以重复利用的,用来实现单一或相关联功能的代码段,可以提高应用的模块性和代码的重复利用率。

函数声明(定义)

        函数的基本组成为:关键字(func),函数名,参数列表,返回值列表,函数体,返回语句。

        普通函数声明(定义)

            func  函数名  (形参列表)  (返回值列表) {

                    函数体

            }

        return 可以作为语句的结束退出,也带一个或多个作为返回值给调用者使用(函数在声明时,包含了返回值列表,那么函数必须以 return 语句结尾)

   函数的返回值

        Go语言支持多返回值,通常以返回值的最后一个返回参数返回执行中可能发生的错误。

        例:conn, err   := connectToNetWork()

        1:同一种类型的返回值

       如果返回值是同一种类型,则用括号将多个返回值类型括起来,return 返回时,返回值顺序与函数声明的返回类型顺序一致,示例代码如下

                func typedTowValues() (int, int) {

                        return  1,  2

                    }

            2:带有变量名的返回值

            Go语言支持对返回值进行命名,这样返回值就和参数一样拥有参数变量名和类型。

            下例中,可以直接对返回值列表中的a,b进行赋值,从而在 return中不填写返回值列表 

            func nameRetValue() (a,b int) {

                a = 1

                b = 2

                return 

                }

        调用函数

        返回值变量列表 =  函数名(参数列表)

函数值传递和引用传递 

        值传递:也就是传递参数的副本,函数接收参数副本之后,在使用变量的过程中只能对副本进行修改,但是不会影响到原来的值,如   func(arg1)

        引用传递:可以直接修改参数的值,而不是对参数副本进行操作,比如在变量名前加 & 符号传递给函数,就是按引用传递,此时传给函数的是一个指针,如 func(&arg1)

        引用传递消耗比值传递少,因此函数调用时,像slice,map,interface,channel类型都是使用引用传递(即使没有显示的指出指针)

函数变量 -- 将函数作为值保存到变量中

        Go语言中,函数也是一种类型,也可以和其他变量一样保存在变量中

        例:func fire() {

                    fmt,Println("fire")

            }

            func main() {

                var f func()    //声明未func()类型,此时 f 被俗称为 "回调函数" ,f 的值为nil

                f = fire            //将fire() 函数名作为值,赋给f变量, 此时 f的值为fire()函数

                f()                    // f 变量进行函数调用,实际上调用的是fire()函数

            }


        未完待续