引入

【1】为什么要使用函数:
提高代码的复用型,减少代码的冗余,代码的维护性也提高了

【2】函数的定义:
为完成某一功能的程序指令(语句)的集合,称为函数。

【3】基本语法

func   函数名(形参列表)(返回值类型列表){
                        执行语句..
                        return + 返回值列表
}

【4】函数的定义和函数的调用案例:

package main
import "fmt"
// func   函数名(形参列表)(返回值类型列表){
// 	执行语句..
// 	return + 返回值列表
// }
//自定义函数:功能:两个数相加:
func cal (num1 int,num2 int) (int) { //如果返回值类型就一个的话,那么()是可以省略不写的
        var sum int = 0
        sum += num1
        sum += num2
        return sum
}
func main(){
        //功能:10 + 20
        //调用函数:
        sum := cal(10,20)
        fmt.Println(sum)
        // var num1 int = 10
        // var num2 int = 20
        //求和:
        // var sum int = 0
        // sum += num1
        // sum += num2
        // fmt.Println(sum)
        //功能:30 + 50
        var num3 int = 30
        var num4 int = 50
        //调用函数:
        sum1 := cal(num3,num4)
        fmt.Println(sum1)
        //求和:
        // var sum1 int = 0
        // sum1 += num3
        // sum1 += num4
        // fmt.Println(sum1)
}

函数使用细节一:形参、返回值

【1】函数:
对特定的功能进行提取,形成一个代码片段,这个代码片段就是我们所说的函数
【2】函数的作用:提高代码的复用性
【3】函数和函数是并列的关系,所以我们定义的函数不能写到main函数中
【4】基本语法

func   函数名(形参列表)(返回值类型列表){
                        执行语句..
                        return + 返回值列表
} 

(1)函数名:
遵循标识符命名规范:见名知意 addNum,驼峰命名addNum
首字母不能是数字
首字母大写该函数可以被本包文件和其它包文件使用(类似public)
首学母小写只能被本包文件使用,其它包文件不能使用(类似private)

(2)形参列表:
形参列表:个数:可以是一个参数,可以是n个参数,可以是0个参数
形式参数列表:作用:接收外来的数据
实际参数:实际传入的数据

(3)返回值类型列表:函数的返回值对应的类型应该写在这个列表中
返回0个:

返回1个:

返回多个:

函数使用细节二:内存分析

【5】通过例题感受内存分析:

package main
import "fmt"
//自定义函数:功能:交换两个数
func exchangeNum (num1 int,num2 int){ 
        var t int
        t = num1
        num1 = num2
        num2 = t
}
func main(){	
        //调用函数:交换10和20
        var num1 int = 10
        var num2 int = 20
        fmt.Printf("交换前的两个数: num1 = %v,num2 = %v \n",num1,num2)
        exchangeNum(num1,num2)
        fmt.Printf("交换后的两个数: num1 = %v,num2 = %v \n",num1,num2)
}

内存分析:

函数使用细节三:不支持重载

Golang中函数不支持重载

【7】Golang中支持可变参数 (如果你希望函数带有可变数量的参数)

package main
import "fmt"
//定义一个函数,函数的参数为:可变参数 ...  参数的数量可变
//args...int 可以传入任意多个数量的int类型的数据  传入0个,1个,,,,n个
func test (args...int){
        //函数内部处理可变参数的时候,将可变参数当做切片来处理
        //遍历可变参数:
        for i := 0; i < len(args); i++ {
                fmt.Println(args[i])
        }
}
func main(){	
        test()
        fmt.Println("--------------------")
        test(3)
        fmt.Println("--------------------")
        test(37,58,39,59,47)
}

【8】基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。

【9】以值传递方式的数据类型,如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递。

函数使用细节四:函数也是一种数据类型

【10】在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。

package main
import "fmt"
//定义一个函数:
func test(num int){
        fmt.Println(num)
}
func main(){
        //函数也是一种数据类型,可以赋值给一个变量	
        a := test//变量就是一个函数类型的变量
        fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)//a的类型是:func(int),test函数的类型是:func(int)
        //通过该变量可以对函数调用
        a(10) //等价于  test(10)
}

【11】函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用
(把函数本身当做一种数据类型)

package main
import "fmt"
//定义一个函数:
func test(num int){
        fmt.Println(num)
}
//定义一个函数,把另一个函数作为形参:
func test02 (num1 int ,num2 float32, testFunc func(int)){
        fmt.Println("-----test02")
}
func main(){
        //函数也是一种数据类型,可以赋值给一个变量	
        a := test//变量就是一个函数类型的变量
        fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)//a的类型是:func(int),test函数的类型是:func(int)
        //通过该变量可以对函数调用
        a(10) //等价于  test(10)
        //调用test02函数:
        test02(10,3.19,test)
        test02(10,3.19,a)
}

【12】为了简化数据类型定义,Go支持自定义数据类型
基本语法: type 自定义数据类型名 数据类型
可以理解为 : 相当于起了一个别名
例如:type mylnt int -----》这时mylnt就等价int来使用了.

例如:type mySum func (int , int) int -----》这时mySum就等价一个函数类型func(int, int) int

【13】支持对函数返回值命名
传统写法要求:返回值和返回值的类型对应,顺序不能错

升级写法:对函数返回值命名,里面顺序就无所谓了,顺序不用对应