Go 函数

今天学习一下Go语言的函数,先来个例子

  一:函数的声明

func Add(a,b int,c int) (result int,err error){  //1:函数的参数定义和C类别的语言差不多,但是后面多了一个括号,代表的函数的返回值,代替了 C#中的ref和out

  if a<0||b<0{

    err:=error.New("请输入正整数")      //2:当函数中碰到错误信息后,给err变量赋值并返回

    return

  }

  return a+b-c,nil               //3:当结果执行完毕后,返回数据,这边返回的数据必须和函数定义的签名相同

}                        //4:在GO语言中函数的名称(例如Add)有特殊的含义 当函数名称首字母大写时代表着此函数->public 若是小写->private

  二:函数的调用

  result,err:=Add(2,3,4)            //1:函数的返回值是几个就要写几个变量来接收,若是不想要对应的结果,可以用“_”代替 也可以写成"_,err:=Add(2,3,4)"

  三:不定参数

  含义: 函数传入的参数个数为不定数量,看如下例子

  func myfunc(args ...int) {                         //1:"..."代表的传入的参数是不定的 ,int代表这传入的参数都是int类型的参数
    for _, arg := range args {
      fmt.Println(arg)
    }
  }                     //2:这边的参数其实是一个语法糖,当然...int===》[]int也能够达到一个效果,但是在传递的时候会很不方便

  myfunc(2,2,3,4)  myfunc([]int{1,2,3,4}) //3:在函数的调用后可以看到第一种会更舒服

  

  上面是只  传递一种类型的不定参数,当然也可以传递不定类型的参数例如

  func myFunc(str string,args ...interface{}){    //1:注意一下,有多个参数时,不定参数必须要写在传递函数的末尾处,不能写在前面

    for _, arg := range args {           //2:interface{} ->代表object 类型是Go语言中的所有类型系统的父类型
      switch arg.(type) {             //3:arg.(type)-> 获取当前参数的类型
        case int:
          fmt.Println(arg, "is an int value.")
        case string:
          fmt.Println(arg, "is a string value.")
        case int64:
          fmt.Println(arg, "is an int64 value.")
        default:
          fmt.Println(arg, "is an unknown type.")
      }
    }

  }

  四:多返回值

  上面已经看到,GO语言中的函数可以返回多个值,func Add(a,b int) (a int,str string){}   ,代替了C中必须用指针来完成的工作

  五:匿名函数和闭包

     a:匿名函数 大概意思就是 函数声明的时候不需要写函数名,上例子

      func (a int,str string) int{    //1:匿名函数无需写函数名称

        if str=="对折"{

          return a/2

        }

        return  a

      }(1,"对折")                  //2:函数写玩之后紧跟(参数列表)直接调用 也可以  f:=func(a int) int{ return  a}

  

    b:闭包    ->将一个代码块包含在函数中 看例子 

      

    func main() {
      var j int = 5
      a := func()(func()) {           //1:第一个func() 代表一个匿名函数  第二个func()是返回的参数
        var i int = 10        
        return func() {
          fmt.Printf("i, j: %d, %d\n", i, j)
        }
      }()                   
      a()                    //此处又执行一个函数 10 5
      j *= 2                
      a()                    //此处又执行一个函数 10 10
    }

  

   函数就先学到这里了

posted @ 2014-04-19 00:03  Dark_liu  阅读(350)  评论(0编辑  收藏  举报