函数定义
函数定义格式:
func function_name ([parameter list]) [return_types] {
函数体
}
函数定义解析:
func:函数由func开始声明;
function_name: 函数的名称,函数名和参数列表共同构成了函数签名;
parameter_list: 参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称做实际参数。参数列表指定的是参数的类型,顺序,个数。参数不是必须的;
return_types: 返回类型,函数返回一系列的值。return_types是该列值的数据类型。如果函数不需要返回值,则不需要return_types;
函数体: 函数定义的代码集合;
实例:
package main
import "fmt"
func main() {
var b int = 15
var a int = 39
var total = num(a,b)
fmt.Printf("两者之和为:%d",total);
}
func num(par1,par2 int) int{
var num int
num = par1 + par2
return num
}
函数调用
函数创建完成后,可以在main函数中调用,如上面的代码,给函数传递相应的参数并获得返回值即可。
以上实例在 main() 函数中调用 num()函数,执行结果为:
两者之和为:54
函数返回多个值
函数可以有多个返回值(函数的返回值和参数没有关系),但通常情况下都是有输入才有输出;
实例:
package main
import "fmt"
func main() {
var a int = 39
var b string = "test"
var c,d = swap(a,b)
fmt.Printf("d的值为: %d\n",d);
fmt.Printf("c的值为: %s",c);
}
func swap(a int,b string) (string,int){
return b,a
}
返回结果:
d的值为: 39
c的值为: test
函数参数
和其他语言一样,go语言的参数分为:实参和形参,调用函数时参数传递类型分为:值传递和引用传递
传递类型 | 描述 |
值传递 | 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改, 将不会影响到实际参数。 |
引用传递 | 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改, 将影响到实际参数。 |
函数用法
函数作为值
函数定义后可作为值来使用
实例
package main
import (
"fmt"
"math"
)
func main() {
/* 声明函数变量 */
getSquareRoot := func(x float64) float64 {
return math.Sqrt(x)
}
/* 使用函数 */
fmt.Println(getSquareRoot(13))
}
输出结果:
3.605551275463989
函数闭包
闭包是匿名函数,可在动态编程中使用;Go语言支持匿名函数,可作为闭包。匿名函数时一个“内联”语句或者表达式。匿名函数的优越性在于可以直接使用函数内的变量,不用声明。
实例
package main
import "fmt"
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func main(){
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()
/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
返回结果:
1
2
3
1
2
函数方法
方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。
格式:
func (variable_name variable_data_type) function_name() [return_type]{
/* 函数体*/
}
variable_name:参数名称
variable_data_type:参数类型
实例
package main
import (
"fmt"
)
type square struct {
sideLength float64
}
func (sl square) getArea() float64 {
return sl.sideLength * sl.sideLength
}
func main() {
var sl square
sl.sideLength = 3.5
fmt.Println("Area of square(sl) = ", sl.getArea())
}
输出结果为:
Area of square(sl) = 12.25