本文最后更新于203 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
函数
为什么要使用函数!
提高代码的复用型,减少代码的冗余,代码的维护性也提高了
函数的定义:
为完成某一功能的程序指令(语句)的集合,称为函数。
基本语法
func 函数名(形参列表)(返回值类型列表){
执行语句..
return +返回值列表
}
示例
package main
import (
"fmt"
)
//定义一个2个数求和的函数mang
func mang (sum1 int,sum2 int) int {//返回值一个时可以把()省掉
sum := sum1 + sum2
return sum
}
func mang1 (sum1 int,sum2 int)(int,int){//返回值有两个或多个时,需要使用()
sumjia := sum1 + sum2
sumjian := sum1 - sum2
return sumjia,sumjian
}
func main() {
sum := mang(10,20)//调用mang函数求和
fmt.Println(sum)
fmt.Println("---------") //隔断
sum2,sum3 := mang1(10,20)//调用mang1函数求和与差
fmt.Println(sum2,sum3)
}
结果:
案例
package main
import (
"fmt"
)
//定义一个交换函数
func exchangeNum(num1 int,num2 int) {
i := num1
num1 = num2
num2 = i
}
func main() {
var a int = 66
var b int = 99
fmt.Printf("a=%v , b=%v\n",a,b)//未交换前输出a与b的值
fmt.Println("---------")
exchangeNum(a,b)//调佣exchangeNum交换a,b
fmt.Printf("a=%v , b=%v",a,b)//交换后输出a与b的值
}
结果:交换失败
内存分析:
Golang中函数不支持重载
同一个包内不能有两个同名的函数
Golang中支持可变参数(如果你希望函数带有可变数量的参数)
基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
package main
import(
"fmt"
)
//定义一个函数,函数的参数为:可变参数...参数的数量可变
func test (num...int){//num...int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
for i := 1; i < len(num); i++ {
fmt.Println(num[i])
}
}
func main() {
test(1)
fmt.Println("-------")
test(1,2)
fmt.Println("-------")
test(1,2,3)
fmt.Println("-------")
test(1,2,3,4)
fmt.Println("-------")
test(1,2,3,4,5)
}
以值传递方式的数据类型
如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递。
package main
import (
"fmt"
)
//定义一个改变输入指向地址储存的值的函数
func today(num *int) {
*num = 30
}
func main(){
var num int = 10
today(&num)//调用函数改变num指向内存地址储存的值
fmt.Println(num)
}
在Go中,函数也是一种数据类型
可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。
函数可以作为形参,并且调用(把函数本身当做一种数据类型)
package main
import (
"fmt"
)
//定义一个函数
func test (sum int){
fmt.Println(sum)
}
func main() {
a := test //将a定义为test数据类型
fmt.Printf("a的数据类型是%T,test的数据类型是%T\n",a,test)
//a的数据类型是func(int),test的数据类型是func(int)
test1(5,test)
test1(6,a)
}
//func(int)函数作为一种数据类型可以作为形参用于函数的定义
func test1(sum int,sum1 func(int)) {
fmt.Println("---666---")
}
Go支持自定义数据类型
基本语法: type 自定义数据类型名 数据类型
package main
import (
"fmt"
)
func main() {
type kkk int
var a kkk = 5
fmt.Printf("a的数据类型是%T,a的值为%v\n",a,a)
c := test//将b定义为func(int)数据类型
test01(6,test)
test01(8,c)
}
//定义一个函数,可以作为数据类型使用
func test(sum int) {
fmt.Println("----9999----")
}
type myFunc func(int)//给func(int)定义名字为jjj,并用做test01函数作为形参
func test01(a int,b myFunc) {
fmt.Println("----6666----")
}
支持对函数返回值命名
package main
import (
"fmt"
)
//定义一个求和与求差的函数
//对函数返回值进行命名,函数体顺序不用对应
func test(a int,b int)(sum int,sum1 int) {
sum1 = a-b
sum = a+b
return
}
func main() {
a,b:=test(10,20)
fmt.Println(a,"\n",b)
}