《The anatomy of Functions in Go》学习笔记
《Variadic functions in Go》学习笔记
**
函数
函数的定义
- 函数的关键字是func
- 函数可以有返回值也可以没有返回值
- 函数可以是传入蚕食也可以是多传入参数
- 函数可以使单返回值也可以是多返回值
- 函数的返回值可以声明为函数体内的变量
func add(a, b int)(sum int) {sum = a + breturn}
defer 关键字
- defer关键字后跟函数
- defer关键字后函数会在父函数体最后执行
- 如果父函数中存在多个refer关键字函数,运行时将多个refer函数放到栈中,在函数体最后执行的时候按照LIFO的顺序
代码建议:
将下面的代码
if cond1 {...fs.Close(file)} else if cond2 {...fs.Close(file)} else if cond3 {...fs.Close(file)} else {...fs.Close(file)}
替换成
defer fs.Close(file)if cond1 {...} else if cond2 {...} else if cond3 {...} else {...}
Function as type
诸如函数 func append(slice []Type, elems …Type) []Type
的函数类型是 func (slice []Type, elems …Type) []Type
package mainimport "fmt"func add(a, b int) int {return a + b}func subtract(a, b int) int {return a - b}func calc(a, b int, f func(int, int) int ) int {return f(a, b)}func main() {ret := calc(5, 3, add)fmt.Println(ret)}
上面的代码可以对函数类型设置一个别名,代码如下:
package mainimport "fmt"func add(a, b int) int {return a + b}func subtract(a, b int) int {return a - b}type CalcFunc func(int, int) intfunc calc(a, b int, f CalcFunc ) int {return f(a, b)}func main() {ret := calc(5, 3, add)fmt.Println(ret)}
Function as value
- 匿名函数变量 ```go package main import “fmt”
var add = func(a, b int) int { return a + b }
func main() { ret := add(5, 3) fmt.Println(ret) }
<a name="uQVRc"></a>### 立即执行函数```gopackage mainimport "fmt"func main() {sum := func(a, b int) int {return a + b}(3, 5)fmt.Println(sum)}
可变变量函数
可变变量函数append:
func append(slice []Type, elems …Type) []Type
调用append函数:
append(s1, s2…)
_
aslice… 用于解构slice, …Type 用于构建slice
package mainimport "fmt"func getMultiples(factor int, args ...int) []int{multiplies := make([]int, len(args))for index, value := range args {multiplies[index] = value * factor}return multiplies}func main() {origin := []int{1,2,3}ret := getMultiples(5, origin...)fmt.Println(ret)}
_
注意:
切片是数组的引用,
当把切片作为可变变量函数的参数时,在函数中修改切片的值后,
这个修改结果会作用到原数组
**
