文章目录
1、函数的定义
语法:
go
func 函数名(形参列表)(返回值类型列表){
执行语句..
return + 返回值列表
}
注意点:
- 函数名首字母大写,可以被本包和其他包文件调用(public)
- 函数名首字母小写,只能在本包文件中使用(private)
示例:
go
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)
}
无返回值:
go
func cal (num1 int,num2 int) { //无返回值
var sum int = 0
sum += num1
sum += num2
fmt.Println(sum)
}
多个返回值:

多个返回值,但只接收一个返回值,用_忽略:

2、内存分析
go
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) //10、20
exchangeNum(num1,num2)
fmt.Printf("交换后的两个数: num1 = %v,num2 = %v \n",num1,num2) //也是10、20
}

3、注意点
- 和Java不一样,
go不支持方法的重载
- 支持可变长参数,函数内部将可变参数当做切片来处理
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中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量
了。通过该变量可以对函数调用。
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)
}
运行结果:
go
a的类型是:func(int),test函数的类型是:func(int)
10
既然可以有函数类型的变量,那函数类型的形参也可以:

5、自定义数据类型(起别名)
语法:
go
type 自定义数据类型名 数据类型
type mylnt int ,即myInt等价于int
注意,虽然是别名,但仍然不能直接互相赋值。
go
//定义一个函数,把另一个函数作为形参:
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里做对应了。