Go语言入门系列七《Golang函数》

一、函数的概念

函数是基本的代码块,用于执行一个任务。

语法:

func 函数名(参数列表) 返回类型{ //函数体 }

使用案例

func main() {
    return_val := say_hi("cason")
    fmt.Println(return_val)

}
func say_hi(name string) string {
    fmt.Println("hello ", name)
    return "someting"
}

二、Golang 特色函数多返回值

在其他语言中要让一个函数同时有多个值返回,得先将多个返回值处理成结构体或者是类的形式,但是用go语言来实现就十分轻松了

func main() {
    sum1, sum2 := add_ten(10, 20)
    fmt.Printf("sum1 = %d,sum2 = %d \n", sum1, sum2)
}

func add_ten(num1, num2 int) (int, int) {
    return num1 + 10, num2 + 10
}

如果我们只想获得其中一个值,那么可以这样

sum1, _ := add_ten(10, 20)
fmt.Printf("sum1 = %d \n", sum1)

使用 _ 接收我们要忽略的值

三、参数的传递方式

函数的参数有两种传递方式,分别为值传递和引用传递。两者的主要区别为,值传递的特点为复制新值进行传递,在函数内修改值不会影响到原先的变量,而引用传递是使用指针进行传递,在函数内改变值将直接影响原来的变量。

值传递

func main() {
    num := 10
    result := add_ten(num)
    fmt.Printf("old = %d,new = %d \n", num, result)
}

func add_ten(num1 int) int {
    num1 += 10;
    return num1
}

打印结果

num = 10, result = 20 

可以看出 我们定义的 num 最后打印出来的结果还是与之前的一致。并没有因为函数中的操作而受到影响。这就是值传递的直观特点,我们在函数中操作的是复制出来的num的副本

引用传递

func main() {
    num := 10
    result := add_ten(&num)
    fmt.Printf("num = %d, result = %d \n", num, result)
}

func add_ten(num1 *int) int {
    *num1 += 10
    return *num1
}

打印结果

num = 20, result = 20 

这次原来我们定义的num也受到了影响,因为这次我们实际上是传递了num的指针过去。所以我们在函数内对num所做的操作是针对于num本身而不是值传递那样子操作num的副本。

四、函数作为值的使用

这个特点对用过 javascript 等语言的朋友应该不会陌生。在使用过程中我们可以将函数作为值保存在一个变量中,需要时直接使用变量名(...)的方式进行调用。如下面的例子

func main() {
    add_ten := func(num1 int) int {
        return num1 + 10
    }
    fmt.Println(add_ten(10))
}

上面代码中我们把匿名函数赋值给了变量 add_ten 通过 add_ten(num)

五、函数闭包

关于闭包,这里将简单带过,后续会有专门的一篇博文来进行讲述,简单来说,闭包的特性使得我们可以使用函数内的变量而无需声明。请看下面例子

func main() {
    func_1 := num()

    fmt.Println(func_1())
    fmt.Println(func_1())
    fmt.Println(func_1())

    fmt.Println("-------")
    func_2 := num()
    fmt.Println(func_2())
    fmt.Println(func_2())
}

func num() func() int {
    index := 0
    return func() int {
        index++
        return index
    }
}

打印结果

1
2
3
-------
1
2

从语法来看 我们定义了一个函数 func num() 其返回值为一个匿名函数 func() int,而通过这个返回的函数,我们可以操作到函数中的变量 index

代码分析

func_1 := num() 

执行完 num() 之后 相当于是

func_1 := func() int {
    index++
    return index
}

所以接下来调用 func_1() 即可得到 index 自增后的结果。其实换种写法也可以 num()(),但是这种写法没有新的变量对其引用,所以在执行完之后,内存将会被释放。所以 num()() 无论连续调用多少次都不会有自增的效果。结果都将是 1

num()()//第一次
num()()//第二次

打印结果

1
1

未经允许不得转载