一、函数
1. 语法
func 函数名( [参数] ) [返回值类型] { 函数体 }
2. 值传递
默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
1)求a和b两个参数值之和:
package main import "fmt" func main() { result :=sum(1, 2) fmt.Println("a+b之和为:",result) } func sum(a, b int) int { return a+b }
输出结果
a+b之和为: 3
2)Golang的函数返回值可以为多个:
package main import "fmt" func main() { res1,res2 :=fuc(1, 2) fmt.Println(res1,res2) } func fuc(a, b int) (int,int) { return a+b,a-b }
输出结果
3 -1
3)也可以无返回值:
package main import "fmt" func main() { fuc(1, 2) } func fuc(a, b int) { fmt.Println("传入的值为:",a,b) }
输出结果
传入的参数为: 1 2
3. 引用(指针)传递
引用传递是将参数的内存地址传递到函数中,如果在函数中对该参数值进行了修改,那外层的该参数值也会被修改。
举例说明
现在定义一个函数接受一个参数a,在打印a的值后将a赋值为3
下面是值传递的写法:
package main import "fmt" func main() { a :=1 fuc(a) fmt.Println("值未被修改,还是为:",a) } func fuc(a int) { fmt.Println("传入的值为:",a) a=3 }
输出结果
传入的值为: 1 值未被修改,还是为: 1
下面是引用传递的写法:
package main import "fmt" func main() { a :=1 fuc(&a) fmt.Println("值被修改了,由1变为了:",a) } func fuc(a *int) { fmt.Println("传入的值为:",*a) *a=3 }
输出结果
传入的值为: 1 值被修改了,由1变为了 3
二、函数用法
1. Golang中没有class
要知道的是,Golang中并没有Python、Java中的类(class)。Golang一切的一切都是函数,如果要实现一个class的话,可以这样写:
package main import ( "fmt" "strconv" ) // Test 等于声明一个类 type Test struct { name string age int } func (tes *Test) print() string{ return "我的名字是:"+tes.name+",我的年龄为:"+strconv.Itoa(tes.age) } func main() { obj := &Test{"曲鸟",18} //初始化并赋值 b := obj.print() fmt.Println(b) }
输出结果
我的名字是:曲鸟,我的年龄为:18
类中函数带参数的写法:
func (tes *Test) sum(a,b int) string{//求a+b的和 return "a+b="+strconv.Itoa(a+b) } func main() { obj := &Test{"曲鸟",18} b := obj.sum(3,3) fmt.Println(b) }
2. 闭包
闭包可以理解为“定义在一个函数内部的函数“,闭包是一座用于连接函数内部和函数外部的桥梁
对于上面的第一个例子(输出结果如下):
我的名字是:曲鸟,我的年龄为:18
使用闭包可以这样写:
package main import ( "fmt" "strconv" ) func add(name string, age int) func() string { return func() string { //相当于下面main中的obj return "我的名字是:" + name + ",我的年龄为:" + strconv.Itoa(age) } } func main() { obj := add("曲鸟", 18) fmt.Println(obj()) }
3. Golang中函数传递函数
Golang可以将函数作为变量的值
package main import ( "fmt" ) func add9(a int) int {// return a+9 } func main(){ a := func(x int) int { //将该函数赋值给a return add9(6) } fmt.Println("a+9的值为:",a(9)) }
输出结果
a+9的值为: 15