go基本语法学习笔记之函数
2016-01-15 09:41
441 查看
函数定义
func Add(a int, b int) (ret int, err error) { if a < 0 || b < 0 { // 假设这个函数只支持两个非负数字的加法 err= errors.New("Should be non-negative numbers!") return } return a + b, nil // 支持多重返回值 }
函数定义:func 函数名(参数列表) (返回列表){
//函数体,可多值返回
}
//参数类型相同,函数只有一个返回值 func Sum(a,b int) int { return a + b }
注意:GO中包内的函数,类型和变量的对外可见性(可访问性)由函数名,类型和变量标示符首字母决定,大写对外可见,小写对外不可见
不定参数
//同类型的不定参数 func myfunc(args ...int) { for _, arg := range args { fmt.Println(arg) } } //不同类型的不定参数 func MyPrintf(args ...interface{}) { for _, arg := range args { <span style="white-space:pre"> </span>switch arg.(type) { case int: <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>fmt.Println(arg, "is an int value.") <span style="white-space:pre"> </span> case string: <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>fmt.Println(arg, "is a string value.") <span style="white-space:pre"> </span> case int64: <span style="white-space:pre"> </span>fmt.Println(arg, "is an int64 value.") <span style="white-space:pre"> </span> default: <span style="white-space:pre"> </span>fmt.Println(arg, "is an unknown type.") <span style="white-space:pre"> </span>} } } 用interface{}传递任意类型数据是Go语言的惯例用法
函数访问
//对不感兴趣的返回值可以用_忽略 _, err = Add(111, 222) (ret int, err error) //不定长参数调用 myfunc(1,2,3,3) //也可以 myfunc(args...) //还可以 myfunc(args[:5]...)
匿名函数
匿名函数由一个不带函数名的函数声明和函数体组成:f := func(x, y int) int { return x + y } func(ch chan int) { ch <- ACK } (reply_chan) // 花括号后直接跟参数列表表示函数调用
闭包
闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。
GO中的闭包同样也会引用到函数外的变量。闭包的实现确保只要闭包还被使用,那么被闭包引用的变量会一直存在:
var j int = 5 a := func()(func()) { var i int = 10 return func() { fmt.Printf("i, j: %d, %d\n", i, j) } }() a() j *= 2 a()
i, j: 10, 5 i, j: 10, 10变量a指向的闭包函数引用了局部变量i和j,i的值被隔离,在闭包外不能被修改,改变j的值以后,再次调用a,发现结果是修改过的值。在变量a指向的闭包函数中,只有内部的匿名函数才能访问变量i,而无法通过其他途径访问到,因此保证了i的安全性。
相关文章推荐
- [LA] Orthogonal contrasts
- 读《重新定义公司》谷歌是如何运营的 How Google Works
- django rest_framework
- [LA] Diagonal two matrices simultaneously
- POJ3274 -Gold Balanced Lineup- HASH+前缀和
- BZOJ4377 : [POI2015]Kurs szybkiego czytania
- Codeforces 616 D. Longest k-Good Segment
- django 小技巧
- django 学习-12 Django表单 初步
- django 学习-11 Django模型数据模板呈现
- django 学习-10 Django多对多关系模型
- google商店打不开,闪退 google play服务已停止
- Django学习--9 Admin
- go基本语法学习笔记之流程控制
- 【MongoBD】MongoBD持久化
- Ubuntu1404安装gogs过程
- Django 运行错误no enough space left on disk
- Snapdragon Flight
- Golang初级系列教程-继承和子类
- golang 并发 chan