下面是函数的定义和闭包
ps.说到闭包忍不住吐下槽,刚开始看书把我绕糊涂了。后来看了下代码,发现和C#,Lua语言的一样。就是要区分好这个变量是哪一个部分的局部变量,比如 for 循环里面的 i 外部是无法使用的。这个太新手了,就不细说了。
以下,整理过的练习代码
// GoStudy3 project main.go
/*go语言学习
函数
闭包:可以用其他各种语言的局部变量全局变量来理解
*/
package main
import (
"errors"
"fmt"
)
func main() {
fmt.Println(add(1, 5))
fmt.Println(sub(1, 6))
fmt.Println(addAll(1, 2, 3, 4, 5))
showAll("123rr", false, 2.3)
v1 := func(a int, b int) int { //函数可以作为参数传递&使用
return a * b
}
fmt.Println(v1(2, 5))
fmt.Println(func(a int, b int) int { //函数可以直接调用
return a / b
}(4, 2))
}
func add(a int, b int) int {
return a + b
}
func sub(a int, b int) (result int, err error) {
rtnValue := a - b
if rtnValue < 0 {
result = -999999999
err = errors.New("a is smaller than b")
return //可以这样返回值
}
return rtnValue, nil //传统方式的返回值
}
func addAll(a ...int) int { //...type 只能作为最后一个参数
sum := 0
for _, v := range a {
sum += v
}
return sum
}
func showAll(a ...interface{}) { //interface,表示可以传递所有类型的参数,使用它仍然是安全的
for _, v := range a {
switch v.(type) { //识别类型
case int:
fmt.Println(v, "is int")
case string:
fmt.Println(v, "is string")
case float64:
fmt.Println(v, "is float64")
case bool:
fmt.Println(v, "is bool")
default:
fmt.Println("other type")
}
}
}
以上,函数和闭包完成