go语言开发基础14 - 之go语言里的函数之函数与匿名函数

函数是组织好的、可重复使用的、用于执行指定任务的代码块。

Go语言中支持函数、匿名函数和闭包

一、go语言里函数的特点

1.不支持重裁(即一个包里不能有两个名字一样的函数)

2.函数也是一种类型,一个函数可以赋值给变量

3.函数支持多返回值

4.支持匿名函数

 

二、函数传值说明

1.无论是值传递还是引用传递,传递给函数的都是变量的副本

2.值传递是值拷贝,引用是地址拷贝,地址拷贝更高效,值拷贝取决于拷贝对象大小(对象越大,拷贝性能越低)

3.map、slice、chan、指针、interface默认以引用的方式传递,其他的都是值传递

 

三、go语言里的函数语法

func 函数名(参数)(返回值){
    函数体
}

函数的参数和返回值是可选的。

3.1、函数名的定义说明:

1.函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。

2.参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。

3.返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。

4.函数体:实现指定功能的代码块。

 

四、第一个函数示例

一、有参数和返回指的函数定义
func add(x int, y int) (num int) {
    return x + y
}
//函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:

二、没有参数和返回值的函数
func testDemo() {
    fmt.Println("Hello World !")
}

4.1、函数调用

定义了函数之后,我们可以通过函数名()的方式调用函数。 例如我们调用上面定义的两个函数,代码如下:

func main() {
    fmt.Println(add(10, 20))    // 结果为:30
    testDemo()    // 结果为:Hello World !
}

 

五、可变参数

可变参数是指函数的参数数量不固定。Go语言中的可变参数通过在参数名后加...来标识。

注意:可变参数通常要作为函数的最后一个参数。

举个例子:

func intSum2(x ...int) int {
    fmt.Println(x)       //x是一个切片
    sum := 0
    for _, v := range x {
        sum = sum + v
    }
    return sum
}

//执行结果为:
ret1 := intSum2()   // 结果:[]
ret2 := intSum2(10)   // 结果:[10]
fmt.Println(ret1, ret2)   // 结果:0 10

 

5.1、固定参数和可变参数结合使用

固定参数搭配可变参数使用时,可变参数要放在固定参数的后面,示例代码如下:

func intSum3(x int, y ...int) int {
    // fmt.Println(x, y)
    sum := x
    for _, v := range y {
        sum = sum + v
    }
    return sum
}
调用上述函数:

ret5 := intSum3(100)
ret6 := intSum3(100, 10)
ret7 := intSum3(100, 10, 20)
ret8 := intSum3(100, 10, 20, 30)
fmt.Println(ret5, ret6, ret7, ret8)  //100 110 130 160

本质上,函数的可变参数是通过切片来实现的。

 

六、返回值

Go语言中函数支持多返回值,函数如果有多个返回值时必须用()将所有返回值包裹起来,举个例子:

func calc(x, y int) (int, int) {
    sum := x + y
    sub := x - y
    return sum, sub
}

  

6.1、返回值命名

函数定义时可以给返回值命名,并在函数体中直接使用这些变量,最后通过return关键字返回。例如:

func calc(x, y int) (sum, sub int) {
    sum = x + y
    sub = x - y
    return    // 命名返回值后 return后面就不用加内容了
}

  

七、匿名函数

函数当然还可以作为返回值,但是在Go语言中函数内部不能再像之前那样定义函数了,只能定义匿名函数。匿名函数就是没有函数名的函数,匿名函数的定义格式如下:

7.1、一名函数定义语法

func(参数)(返回值){
    函数体
}()        // 函数体后面加()可以直接调用匿名函数了

  

7.2、匿名函数示例

// 1.在函数里定义匿名函数
func test1(a, b int) int {
    result := func(a1 int, b1 int) int {
        return a1 + b1
    }
    return result(a, b)        // 匿名函数的两种调用方法:第一种:再函数的大括号后面直接加小括号实现调用。第二种:通过变量加小括号实现调用
}
// 2.在外部直接定义匿名函数 var ( result := func(a1 int, b1 int) int { return a1 + b1 }(10, 20) // 加()直接实现调用该匿名函数 )

匿名函数多用于实现回调函数和闭包。

 

posted @ 2020-05-28 18:15  欧-阳  阅读(347)  评论(0)    收藏  举报