您的位置:首页 > 编程语言 > Go语言

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的安全性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: