《The anatomy of Functions in Go》学习笔记
《Variadic functions in Go》学习笔记
**
函数
函数的定义
- 函数的关键字是func
- 函数可以有返回值也可以没有返回值
- 函数可以是传入蚕食也可以是多传入参数
- 函数可以使单返回值也可以是多返回值
- 函数的返回值可以声明为函数体内的变量
func add(a, b int)(sum int) {
sum = a + b
return
}
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 main
import "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 main
import "fmt"
func add(a, b int) int {
return a + b
}
func subtract(a, b int) int {
return a - b
}
type CalcFunc func(int, int) int
func 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>
### 立即执行函数
```go
package main
import "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 main
import "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)
}
_
注意:
切片是数组的引用,
当把切片作为可变变量函数的参数时,在函数中修改切片的值后,
这个修改结果会作用到原数组
**