1.1. 一、函数的语法:
func 函数名(形参列表) (返回值类型列表){
//函数体
return 返回值列表
}
- 1.1、如果只返回一个值。返回值列表的括号可以去掉。例子如下:
func add(a int,b int) int {
return a+b
}
func main() {
fmt.Println(add(10,90)) //输出: 100
}
- 1.2、调用一个函数时,会在栈给这个被调用的函数分配一个新的空间;当函数执行完成后,会回收这个新的空间。
- 1.3、如果返回多个值,可以用下划线 _ 表示忽略这个返回值。
- 1.4、基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
- 1.5、如果参数是指针类型,可以传入变量的地址&,函数内以指针的方式操作变量。在函数内修改,就会影响到原来的值。从效果上看类似引用 。
例子如下:func add(a *int) 函数接收指针作为参数,内部修改参数的值,会反应到外部传递的参数值。
func add(a *int) int {
*a = *a + 3 //a的值加3
return *a
}
func main() {
num := 8
add(&num) //传递num的地址
fmt.Println("num = ",num) //num = 11
}
- 1.6、Go 函数不支持函数重载。
例子如下:add函数不支持重载
func add(a *int) int {
*a = *a + 3 //a的值加3
return *a
}
//编译错误,不支持函数重载
func add(a int,b int) int {
return a
}
- 1.7、在 Go 中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。(这个类似JavaScript的函数变量)
func add(a int,b int) int {
return a +b
}
func main() {
var addNum = add //变量addNum等于函数add
sum := addNum(3,4) //调用函数
fmt.Println(sum) //7
}
也可以这样:变量addNum 等于一个匿名函数。
var addNum = func(a int,b int) int { return a +b}
sum := addNum(3,4)
fmt.Println(sum) // 7
- 1.8、函数作为一种数据类型。可以像使用其他数据类型哪样使用。比如:作为另一个函数的形参。
例子如下:下面的getSum函数的形参addFunc是一个函数类型。
func add(a int,b int) int {
return a +b
}
//第一个参数addFunc是函数类型,并且有2个形参,一个返回值。
func getSum(addFunc func(a int,b int) int,num1 int, num2 int) int {
return addFunc(num1,num2)
}
func main() {
//调用函数getSum,并且把add函数作为参数
sum := getSum(add,3,4)
fmt.Println(sum) // 7
}
- 1.9、golang可以自定义数据类型。使用关键字type。语法如下:
type 自定义数据类型名 数据类型
例子:
type myInt int // 这时 myInt 就等价 int 来使用了.
type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int)
完整例子如下:
func add(a int,b int) int {
return a +b
}
type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int)
//第一个参数addFunc是函数类型,并且有2个形参,一个返回值。
func getSum(addFunc mySum,num1 int, num2 int) int {
return addFunc(num1,num2)
}
func main() {
//调用函数getSum,并且把add函数作为参数
sum := getSum(add,3,4)
fmt.Println(sum) // 7
}
- 1.10、支持对函数返回值命名。
例子如下:就是函数声明的时候,把返回值的名字一起声明了。好处是返回值和顺序无关了,只要把对应的返回值赋值就行了。
func getSumAndSub(a int,b int) (sum int,sub int) {
sum = a + b
sub = a - b
return
}
func main() {
sum,sub := getSumAndSub(3,4)
fmt.Println(sum,sub) // 7 -1
}
- 1.11、go支持可变参数。如果一个函数的形参列表中有可变参数,则可变参数需要放在最后。
例子如下:其中的args是可变参数的变量名,是slice切片。可以通过args[index]取出变量的值。
// 支持0到n个参数
func sum(args... int) int {
sum := 0
for i:=0;i<len(args);i++ {
sum += args[i] //args[i] 表示取出args切片的第i个元素值。
}
return sum
}
// 支持1到n个参数
func sum2(num1 int , num2... int) int {
sum := num1
for i:=0;i<len(num2);i++ {
sum += num2[i]
}
return sum
}
- 1.12、形参(或返回值)数据类型一样的时候。可以简写。这个和声明多个变量一样。
例子如下:形参都是int就简写了。返回值都是int,也简写了。
func getSumAndSub(a,b int) (sum,sub int) {
sum = a + b
sub = a - b
return
}