工作生活

Golang笔记: 函数(func)和方法(method)

2019-07-16  本文已影响0人  Boston199834

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

函数声明(定义)

        函数的基本组成为:关键字(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()函数

            }

匿名函数

        匿名函数是指不需要定义函数名的一种函数实现方式,即函数可以像普通变量一样传递或使用

        例:  func (参数列表) (返回值列表){

                函数体

        }

        1:在定义时调用匿名函数

     例如: func(data int) {

                    fmt.Println("this is go", data)

                } (100)   //表示对匿名函数进行调用

            2:将匿名函数赋值给变量

                f := func(data int) {  // 将匿名函数体保存到f()中

                        fmt.Println("hello", data)

                }

                    f(100)  // 使用f()调用

     


上一篇 下一篇

猜你喜欢

热点阅读