函数
一、函数定义
在go语言中函数定义格式如下:
func 函数名([参数列表]) [返回值类型]{
函数主体
}//中括号内是可选参数
eg:
func GetSum(num1 int, num2 int) int { result := num1 + num2 return result }
二、值传递和引用传递
值传递:在函数调用过程中将实参拷贝一份到函数中,这样在函数中如果对参数进行修改,将不会影响到实参
引用传递:在函数调用过程中将实参的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实参。
示例代码:
func paramFunc(a int, b *int, c []int) {
a = 100
*b = 100
c[1] = 100
fmt.Println("paramFunc:")
fmt.Println(a)
fmt.Println(*b)
fmt.Println(c)
}
func main() {
a := 1
b := 1
c := []int{1, 2, 3}
paramFunc(a, &b, c)//此处将b的地址传到调用函数,其结果是改变b的值
fmt.Println("main:")
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
}
三、变长参数
当在编写函数时不知道传递参数多少可以使用变长参数,在GO语言中变长参数必须放置在函数参数的最后一个
eg:常调用的fmt中的printf函数
func Printf(format string, a ...interface{}) (n int, err error) {
return Fprintf(os.Stdout, format, a...)
}
四、多返回值
通过返回函数调用结果和错误值,来看函数是否调用成功
eg:
func div(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("The divisor cannot be zero.")
}
return a / b, nil
}
func main() {
result, err := div(1, 2)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println("result: ", result)
}
五、命名返回值
即给返回值命名,eg:
func div(a, b float64) (result float64, err error) {
六、匿名函数
没有名字的函数,可以直接调用,保存到变量,作为参数或者返回值。
七、闭包
一个函数与这个函数外部变量的一个封装
代码如下(示例):
func add() func(int) int { //定义add函数,然后在函数内返回一个匿名函数
n := 10
str := "string" //n,str和匿名函数构成了闭包,也就是从这里初始化后,之后再调用不会重新赋初值
return func(x int) int {
n = n + x
str += strconv.Itoa(x)
fmt.Print(str, " ")
return n
}
}
func main() {
f := add()
fmt.Println(f(1))
fmt.Println(f(2))
fmt.Println(f(3))
f = add()
fmt.Println(f(1))
fmt.Println(f(2))
fmt.Println(f(3))
}