函数基本使用
一、定义格式
函数构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func
、函数名、参数列表、返回值、函数体和返回语句。
Go 语言函数定义格式如下:
func FuncName(/*参数列表*/) (o1type1,o2type2/*返回类型*/) {
//函数体
return v1, v2//返回多个值
}
使用函数主要是为了方便我们以后一些大量代码的调用。
func FuncName
就是定义一个函数给他起个名字,func FuncName (a int, b int)
在这个里面可以传两个int值,func FuncName (a int, b int)(va int,vb int){}
中的va
和vb
是函数返回值。
二、无参无返回值
func Test() {//无参无返回值函数定义
fmt.Println("this is a test func")
}
func main() {
Test() //无参无返回值函数调用
}
这个是最简单的函数了,只要在main
里面调用就行,Test()
然后就会打印,this is a test func
二、 有参无返回值
1. 普通参数列表
func Test01(v1int,v2int) {//方式1
fmt.Printf("v1=%d,v2=%d\n",v1,v2)
}
func Test02(v1,v2int) {//方式2, v1, v2都是int类型
fmt.Printf("v1=%d,v2=%d\n",v1,v2)
}
func main() {
Test01(10,20) //函数调用
Test02(11,22) //函数调用
}
意思就是我Test01
明确表明了我的参数是两个int
类型,Test02
里面的v1
就没有明确表明是什么类型,其实都是一样的,然后在main
里面调用展示一下。
2. 不定参数列表
2.1 不定参数类型
不定参数是指函数传入的参数个数为不定数量。为了做到这点,首先需要将函数定义为接受不定参数类型:
//形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数
func Test(args...int) {
for_,n := range args{//遍历参数列表
fmt.Println(n)
}
}
func main() {
//函数调用,可传0到多个参数
Test()
Test(1)
Test(1,2,3)
}
Test(args...int)
代表不确定有多少个int类型的参数要放到里面。
2.2 不定参数的传递
func MyFunc01(args...int) {
fmt.Println("MyFunc01")
for_,n := range args{//遍历参数列表
fmt.Println(n)
}
}
func MyFunc02(args...int) {
fmt.Println("MyFunc02")
for_,n:=range args{//遍历参数列表
fmt.Println(n)
}
}
func Test(args...int) {
MyFunc01(args...)//按原样传递,Test()的参数原封不动传递给MyFunc01
MyFunc02(args[1:]...)//Test()参数列表中,第1个参数及以后的参数传递给MyFunc02
}
func main() {
Test(1,2,3)//函数调用
}
Test
里面调用MyFunc01
和MyFunc02
,并且把所有参数都传给了MyFunc01
,把除了第0个参数外的其他参数传给了MyFunc02
。
三、 无参有返回值
有返回值的函数,必须有明确的终止语句,否则会引发编译错误。
1. 一个返回值
//方式1
func Test01() int {
return 250
}
// 这个int就是定义的返回值类型,也就是说你的返回值只能是int类型,不能回其他类型
// 官方建议:最好命名返回值`func Test01()(a int){ a=250 return a}`
// 因为不命名返回值,虽然使得代码更加简洁了,但是会造成生成的文档可读性差
//方式2,给返回值命名
func Test02() (value int) {
value=250
return value
}
//方式3,给返回值命名
func Test03() (value int) {
value = 250
return
}
func main(){
v1 := Test01()//函数调用
v2 := Test02()//函数调用
v3 := Test03()//函数调用
fmt.Printf("v1=%d,v2=%d,v3=%d\n", v1, v2, v3)
}
2. 多个返回值
//方式1
func Test01() (int,string) {
return 88,"zhiliao"
}
//方式2,给返回值命名
func Test02() (a int,str string) {
a = 88
str = "zhiliao"
return a,str
}
func main(){
v1,v2 := Test01() // 函数调用
_,v3 := Test02() // 函数调用,第一个返回值丢弃
v4,_ := Test02() // 函数调用,第二个返回值丢弃
fmt.Printf("v1=%d,v2=%s,v3=%s,v4=%d\n",v1,v2,v3,v4)
}
四、有参有返回值
//求2个数的最小值和最大值
func MinAndMax(num1 int, num2 int) (min int, max int) {
if num1 > num2{//如果num1大于num2
min = num2
max = num1
} else {
max = num2
min = num1
}
return
}
func main() {
min,max := MinAndMax(33,22)
fmt.Printf("min=%d,max=%d\n", min, max) //min=22,max=33
}
用两个参数和两个返回值,在我们掉用方法的时候就会传两个参数32
,22
然后我们进去判断一下如果32
比22
大那么我们就把22
赋值给返回值min
,然后把32
赋值给返回值max
,然后return
出去就好了。