一、Go语言函数的格式
函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。
函数的要素:
- 函数名:需要调用的函数名。
- 参数列表:参数变量以逗号分隔,尾部无须以分号结尾。
- 返回值变量列表:多个返回值使用逗号分隔。
// 没有返回值的函数 func log(message string) { } // 有一个返回值的函数 func add(a , b int) int { return var1 } // 有多个返回值的函数 func power(name string) (int, bool) { return var1,var2 } // 给返回值 命名 func add(a, b int) (c int) { c = a + b return c }
多返回值函数的使用
func main() { a := 0 b := 0 a, b = addAndMultiply(10, 20) fmt.Println("a=", a) fmt.Println("b=", b) } func addAndMultiply(a, b int) (int, int) { return a + b, a * b }
二、函数作为参数
package main import "fmt" import "strings" func main() { str := strToCase("ABDCFSDFE", processLetter) fmt.Println(str) } //将函数作为参数 func strToCase(str string, myfunc func(string) string) string { return myfunc(str) } //字符串奇偶交替 func processLetter(str string) (result string) { for i, value := range str { if i%2 == 0 { result += strings.ToUpper(string(value)) } else { result += strings.ToLower(string(value)) } } return result }
使用 type自定义类型
package main import "fmt" import "strings" func main() { str := strToCase("ABDCFSDFE", processLetter) fmt.Println(str) } //将函数作为参数(使用type定义的参数类型) func strToCase(str string, myfunc processLetterFunc) string { return myfunc(str) } //使用type 为processLetter() 函数定义类型 type processLetterFunc func(string) string //字符串奇偶交替 func processLetter(str string) (result string) { for i, value := range str { if i%2 == 0 { result += strings.ToUpper(string(value)) } else { result += strings.ToLower(string(value)) } } return result }
三、匿名函数
匿名函数的格式与使用
package main import "fmt" import "strings" func main() { //创建匿名函数并直接使用 func(str string) { fmt.Println("str=", str) }("hello") //将匿名函数赋值给一个变量 fun := func(str string) { fmt.Println("str=", str) } fun("word") //将匿名函数赋值给一个变量(有返回值) rFun := func(str string) string { return strings.ToUpper(str) } result := rFun("Hello word") fmt.Println("result=", result) }
匿名函数作为回调函数的使用
package main import "fmt" import "math" func main() { arr := []float64{1, 2, 3, 4, 5} //匿名函数的使用进行平方根的运算 result := filterSlice(arr, func(str float64) string { str = math.Sqrt(str) return fmt.Sprintf("%.2f", str) }) fmt.Println("result=", result) } type fs func(float64) string //遍历切片,对每个数据进行处理 func filterSlice(arr []float64, f fs) []string { var result []string for _, value := range arr { result = append(result, f(value)) } return result }
二、变量的作用域
1、局部变量与全局变量同名时,局部变量优先
//全局变量 var num int = 100 var num2 int = 200 func main() { num, num2 := 1, 2 fmt.Println("num=", num) // num=1 fmt.Println("num2=", num2)// num2=2 }