go基本语法学习笔记之函数
来源:互联网 发布:java调试器 编辑:程序博客网 时间:2024/05/23 19:11
函数定义
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 = 5a := func()(func()) { var i int = 10 return func() { fmt.Printf("i, j: %d, %d\n", i, j) }}()a()j *= 2a()
i, j: 10, 5i, j: 10, 10变量a指向的闭包函数引用了局部变量i和j,i的值被隔离,在闭包外不能被修改,改变j的值以后,再次调用a,发现结果是修改过的值。在变量a指向的闭包函数中,只有内部的匿名函数才能访问变量i,而无法通过其他途径访问到,因此保证了i的安全性。
0 0
- go基本语法学习笔记之函数
- go基本语法学习笔记之类型
- go基本语法学习笔记之变量与常量
- go基本语法学习笔记之流程控制
- go基本语法学习笔记之错误处理
- go基本语法学习笔记之面向对象
- go基本语法学习笔记之面向对象:接口
- go基本语法学习笔记之并发编程
- Go语言学习笔记之基本数据类型
- go 学习1【基本语法】
- go 学习2【基本语法】
- Go语言学习笔记之函数(function)
- PHP基础学习笔记之基本语法
- Python语言学习笔记之基本语法
- lua学习笔记之基本语法
- Java学习笔记之基本语法
- Go 函数 学习笔记
- python 入门学习笔记之基本语法与基本数据类型
- github使用总结
- EJB,产品 or 标准?
- SQL 查询重复数据并显示重复次数
- ubuntu 14.04下matcaffe的配置
- 天声人語 20160115 青春うたう百人一首
- go基本语法学习笔记之函数
- unordered_map与线性结构内存占比
- Android酷炫实用的开源框架(UI框架)
- 日经春秋 20160115
- Java Web学习总结(4)——HttpServletResponse对象入门
- 肠胃不适引起的发烧
- 三级联动
- GitHub 使用教程详解
- 解决ajax跨域的方法原理详解