golang 函数(1)

Go 里面有三种类型的函数:

1.普通的带有名字的函数

2.匿名函数或者lambda函数

3.方法

 

函数重载(function overloading)指的是可以编写多个同名函数,只要它们拥有不同的形参与/或者不同的返回值,在 Go 里面函数重载是不被允许的。这将导致一个编译错误:

funcName redeclared in this book, previous declaration at lineno

Go 语言不支持这项特性的主要原因是函数重载需要进行多余的类型匹配影响性能;没有重载意味着只是一个简单的函数调度。所以你需要给不同的函数使用不同的名字,我们通常会根据函数的特征对函数进行命名

 

函数也可以以申明的方式被使用,作为一个函数类型,就像:

type binOp func(int, int) int // 类型

 

按值传递和按引用传递

Go 默认使用按值传递来传递参数,也就是传递参数的副本。使用变量的过程中可能对副本的值进行更改,不会影响到原来的变量

如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(指针或引用)(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,我们可以通过这个指针的值来修改这个值所指向的地址上的值。(译者注:指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址)

按引用传递我觉得也是按值传递,只是这个值是引用的内存地址.

几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。

在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。

 

函数返回值

当需要返回多个非命名返回值时,需要使用 () 把它们括起来,比如 (int, int)

命名返回值作为结果形参(result parameters)被初始化为相应类型的零值,当需要返回的时候,我们只需要一条简单的不带参数的return语句。需要注意的是,即使只有一个命名返回值,也需要使用 () 括起来

尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂。

 

空白符

空白符用来匹配一些不需要的值,然后丢弃掉。通常多返回值时使用,比如list在range循环时,index,value 这时 可以不要index,而采用空白符  _,value

 

变长参数

函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数

 func myFunc(a, b, arg ...int) {}

如果参数被存储在一个数组 arr 中,则可以通过 arr... 的形式来传递参数调用变参函数

 arr := []int{7,9,3,5,1}

 x = dosomething(arr...)

 

defer

关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数

defer 的用法类似于面向对象编程语言 Java 的 finally 语句块,它一般用于释放某些已分配的资源。

当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出)

使用 defer 的语句同样可以接受参数,并且变量内容是在代码顺序执行到defer时的值,defer只是把调用押后,但是赋值时还是按代码顺序运行到defer是变量的值

 

posted @ 2019-09-10 10:14  DreamAgain~  阅读(185)  评论(0)    收藏  举报