go语言学习(三)——函数和闭包

下面是函数的定义和闭包

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")
		}

	}

}

 

以上,函数和闭包完成

原文地址:https://www.cnblogs.com/singledigit/p/6379169.html