下面是函数的定义和闭包
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") } } }
以上,函数和闭包完成