文章目录
- 1、函数的定义
- 2、内存分析
- 3、注意点
- 4、函数数据类型
- 5、自定义数据类型(起别名)
- 6、支持对返回值命名
1、函数的定义
语法:
func 函数名(形参列表)(返回值类型列表){执行语句..return + 返回值列表
}
注意点:
- 函数名首字母大写,可以被本包和其他包文件调用(public)
- 函数名首字母小写,只能在本包文件中使用(private)
示例:
func cal (num1 int,num2 int) (int) { //如果返回值类型就一个的话,那么()是可以省略不写的var sum int = 0sum += num1sum += num2return sum
}func main(){//功能:10 + 20//调用函数:sum := cal(10,20)fmt.Println(sum)
}
无返回值:
func cal (num1 int,num2 int) { //无返回值var sum int = 0sum += num1sum += num2fmt.Println(sum)
}
多个返回值:
多个返回值,但只接收一个返回值,用_忽略:
2、内存分析
package main
import "fmt"
//自定义函数:功能:交换两个数
func exchangeNum (num1 int,num2 int){ var t intt = num1num1 = num2num2 = t
}
func main(){ //调用函数:交换10和20var num1 int = 10var num2 int = 20fmt.Printf("交换前的两个数: num1 = %v,num2 = %v \n",num1,num2) //10、20exchangeNum(num1,num2)fmt.Printf("交换后的两个数: num1 = %v,num2 = %v \n",num1,num2) //也是10、20
}
3、注意点
- 和Java不一样,
go不支持方法的重载
- 支持可变长参数,函数内部将可变参数当做切片来处理
package main
import "fmt"
//可变参数 ... 参数的数量可变,Java中是【类型... 可变长参数名】
//args...int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
func test (args...int){//函数内部处理可变参数的时候,将可变参数当做切片来处理//遍历可变参数:len函数求长度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)
}
基本数据类型和数组默认都是值传递的,即进行值拷贝
,调函数修改,不会影响原来的值
- 以值传递方式的数据类型,如基本数据类型,如果希望
在函数内的变量能修改函数外的变量,可以传入变量的地址&
,函数内以指针的方式操作变量
4、函数数据类型
在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(10) //等价于 test(10)
}
运行结果:
a的类型是:func(int),test函数的类型是:func(int)
10
既然可以有函数类型的变量,那函数类型的形参也可以:
5、自定义数据类型(起别名)
语法:
type 自定义数据类型名 数据类型
type mylnt int ,即myInt等价于int
注意,虽然是别名,但仍然不能直接互相赋值。
//定义一个函数,把另一个函数作为形参:
func test02 (num1 int ,num2 float32, testFunc func(int)){fmt.Println("-----test02")
}//type
type myFunc func(int)
func test02 (num1 int ,num2 float32, testFunc myFunc){fmt.Println("-----test02")
}
6、支持对返回值命名
对函数返回值命名,里面顺序就无所谓了,顺序不用对应,也不用return后面跟了。旧的写法:
此时,result01就对应第一个返回值,int类型,result02就对应第二个返回值,int类型。改用升级写法:
有了命名,就不用再return里做对应了。