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
原创粉丝点击