Go_函数
函数 : 实现某些功能的代码的封装
Go函数声明
// 基本格式 func 函数名(变量 类型, ...) 返回值类型{ 函数体 } // 示例 func add(a int, b int) int{ return a+b } // 接收多参数, 一定要在最后面, 该变量是一个数组 func 函数名(变量 ...类型) 返回值类型{ 函数体 } // 示例 func add(num ...int) int { sum := 0 for _, v := range num{ sum += v } return sum } // 多返回值 func 函数名(变量 类型, ...) (返回值类型,返回值类型){ 函数体 } // 示例 过,多返回值经常被用到 // 命名返回值, return后不必写返回的值, 只要把返回值的变量赋值就行 // 示例 func add(a ,b int)(c int){ c = a+b return }
Go函数特性
匿名函数 -- 过
func(参数列表){ 函数体 }(实参)
Go语言 函数也是一种类型(可以作为函数参数的类型), 一个函数可以赋值给变量
相同参数,返回值的函数可以认为是相同类型
import "fmt" func def(a func(int,int)int) int{ return a(2,1) } func add(a,b int)int{ return a+b } func mul(a, b int)int{ return a*b } func main() { fmt.Println(def(add)) fmt.Println(def(mul)) }
闭包: 一个函数和与其相关的引用环境组合而成的实体; 也就是我们说的在一个函数内部访问外部的非全局变量
package main import “fmt” func Adder() func(int) int { var x int return func(delta int) int { x += delta // 与python不同, 函数是可以访问和修改外部变量的 return x } } func main() { var f = Adder() fmt.Print(f(1),” - “) fmt.Print(f(20),” - “) fmt.Print(f(300)) }
值传递 : 函数内部使用的是实参的副本
defer语句 : 函数中定义defer语句, 在函数结束时执行, 其执行的函数实际传入的值就是defer语句定义时传入的值, 而并非函数结束时的值, 多个defer定义后进先出
package main import "fmt" func aa(a int){ fmt.Println(a) } func main() { var a = 1 defer aa(a) defer aa(100) a += 12 fmt.Println(a) } // 13 // 100 // 1
defer常用来进行回收操作(比如, 关闭文件句柄)
Go特殊函数
init函数 : 每个源文件都可以包含一个init函数, 在main函数执行之前被Go框架调用
package main import "fmt" var a string var b int func main(){ fmt.Println(a) fmt.Println(b) } func init(){ a = "hello word" b = 10 }
一个包被导入时, 其内部的init()方法也会被执行
内置函数
close:主要用来关闭channel
len:用来求长度,比如string、array、slice、map、channel
new:用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
append:用来追加元素到数组、slice中
panic和recover:用来做错误处理