Go 函数

函数

概念

执行特定任务的代码块

声明

go语言至少有一个main函数

  1. 语法格式

    func funcName(parametername type1,parametername type2)(out1 type1,out2 type2){
        return value1,value2
    }
    
    1. func: 函数由func声明
    2. funName:函数名称,函数名称和参数列表一起构成函数签名
    3. parametername type: 参数列表,参数就像一个占位符,但函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型,顺序,及参数个数。参数是可选的,也就是说参数也可以不包含参数。
    4. out1 type1:返回类型,函数返回一列值。
    5. 上面返回值声明了两个变量out1和out2,如果不想声明也可以,直接写两个类型type1,type2也可以。
    6. 如果只有一个返回值且不声明返回值变量,那么你可以省略包裹返回值的括号(即一个返回值可以不声明)
  2. 参数

    1. 形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参

    2. 实际参数:调用参数时,传给形参的实际数据,叫做实际参数,简称实参

    3. 参数调用:

      1. 函数名称必须匹配
    4. 实参与形参必须一一对应:顺序,个数,类型

    5. 如果参数类型相同,还可以简化写法

         func getAdd(a,b int){
      	fmt.Printf("%d+%d=%d\n",a,b,a+b)
         }
      
    6. 可变参数

      1. 语法

        func funName(arg ...int){
        
        }
        //注意,这里得参数全部都是int型得
        //在函数体中,arg是一个int型得切片
        //调用带可变参数得函数时,可以传入任意数量的参数,也可以不传入任何参数
        
        func getSum(args ...int){
        	fmt.Printf("%T",args) //[]int
        } 
        
      2. 常用可变参的函数

        Println() Printf() Print()

        append()

      3. 将切片作为参数,调用可变参函数

        s1 := []int{1,2,3}
        getSum(s1...) //切片变量后加上三个点...(s1...),才能作为可变参数传入函数
        
      4. 注意事项

        1. 如果一个函数的参数是可变参数,同时还有其他参数,可变参数要放在参数列表的最后
        2. 一个参数列表中,最多只能有一个可变参数
  3. 参数传递

    1. 数据类型

      一. 按照数据类型来分:

      ​ 基本数据类型:

      ​ int,float,string,bool

      ​ 符合数据类型:

      ​ array,slice,map,struct,interface

      二.按照数据的存储特点来分:

      ​ 值类型的数据:操作的数值本身

      ​ int,float,bool,string,array,struct

      ​ 引用类型的数据:操作的是数据的地址

      ​ slice,map,chan

    2. go函数的参数也是存在值传递和引用传递的

      1. 值传递:传递的是数据的副本,修改数据,对于原始数据没有影响

        值类型的数据,默认都是值传递

      2. 引用传递:传递的是数据的地址。导致多个变量指向同一块内存,通过参数传递的是地址副本。

        引用类型的数据,默认都是引用传递。

  4. 函数返回值

    1. 定义

      一个函数被调用后,返回给调用处的执行结果,叫做函数的返回值。调用处需要用变量接收返回结果

    2. 无定义变量返回值

      func getAdd(a,b int) (int) {
          int sum = a + b
      	fmt.Printf("%d+%d=%d\n",a,b,sum)
          return 
      }
      
    3. 有定义变量的返回值

      //这种写法实际就是现在函数中定义了一个变量sum,值也就是这种类型的零值
      func getSum(args ...int)(sum int) {//定义函数时,指明要返回的数据是哪一个。
      	for _,v := range args {
      		//fmt.Println(v)
      		sum += v
      	}
      	return
      }
      
      //如果函数末尾使用了return 0,则getSum函数会返回0,不再是sum的真实值了
      
  5. 多返回值

    func getSum2()(int ,int){ //无定义变量形式
    	return 0,2
    }
    
    func getSum3()(a,b int){//有定义变量形式
    	a,b = 1,2
    	return
    }
    
  6. return语句

    1. 一个函数定义了返回值,必须使用return语句将结果返回调用处。

    2. return后的数据必须与函数定义一致:个数,类型,顺序

    3. 可以使用_,舍弃多余的返回值

    4. 如果函数定义定义了返回值,那么函数中有分支,循环,那么要保证,无论执行了那个分支,都要有return语句被执行到。

    5. 如果函数没有定义返回值,那么函数中也可以使用return,专门用于结束函数的执行。

函数中变量作用域

  1. 作用域

    变量可以使用的变量

  2. 局部变量

    函数内部定义的变量

    变量在哪里定义,就只能在哪个范围内使用,超出这个范围,我们认为变量就被销毁了

    范围内部定义的变量会覆盖范围外部的同名变量

  3. 全局变量

    函数外部定义的变量

    短变量不能定义在函数外部

    所有函数都可以使用,而且共享这一份数据

posted @ 2020-03-16 09:27  henryno12  阅读(137)  评论(0编辑  收藏  举报