Golang 函数

 

函数基础介绍

- 函数声明:

  - 基础语法:

func functionname(parametername type) returntype {  
    // 函数体(具体实现的功能)
}

// 解析:
functionname: 函数名
parametername type: 参数名,以及参数类型;(可多选,亦可不选)
returntype:返回值的类型;(可多选,亦可不选)

 

    - 小demo:

package main

import (
    "fmt"
)

func hello() {
    fmt.Println("Hello")
}

func main() {
    hello()
}

 

  - 参数名:

    - 若同时有多个相同类型的参数,只需在最后一个参数后面声明参数类型即可:

    - 示例:

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

 

- 返回值 return

  - 没有返回值:

    - 若函数没有返回值,则不能进行赋值给变量;

  - 单个返回值:

    - 直接在形参的扩号后面加上返回值的类型即可:

func hello() int {
    fmt.Println("Hello")
    return 0
}

 

  - 多返回值:

    - 支持一个函数可以有多个返回值。

    - 若返回多个返回值,返回值的类型需要用括号括起来;

    - 示例:

func hello(a, b string) (int, int) {
    c := a + b
    fmt.Println("Hello, ", c)
    return 0, 1
}

 

  - 命名返回值:

    - 在函数中也可以将返回值直接先命名;这样相当于在函数作用域中的第一行就声明的了变量;

    - 不需要在return中明确指定返回值,默认会返回,作用域中的定义后的值;当然了也可以直接定义,不过这样会覆盖掉有了名字的返回值:

    - 示例:

func hello(a, b string) (num1 int, num2 int) {
    num1 = len(a)
    num2 = len(b)
    return 
}

 

 

- 空白符:

  - _ 在 Go 中被用作空白符,可以用作表示任何类型的任何值。

  - 当函数返回多个值,但是只需要用到其中一个时,这时候就可以利用_空白符;

  - 示例:

package main

import (
    "fmt"
)

func hello(a, b string) (num1, num2, num3 int) {
    num1 = len(a)
    num2 = len(b)
    num3 = len(b)
    return
}

func main() {
    a, _, _ := hello("wor", "ld")
    fmt.Println(a)
}

 

- 函数调用:

  - 语法: 函数名() ;

  - 等同于python中的函数调用;不过,不支持 位置传参;

可变参数

 - 在函数中,最后一个参数是:...T  :表示该函数可以接受任意个数类型为T的参数作为最后参数;

- 工作原理:

  - ... 在go中作为语法糖,等同于python中的 * ;在形参上为 聚合,调用时的实参为打散;

  - 将可变参数,组成了一个切片,雷同与python中的*args;

  - 因为可变参数,会组成一个切片,所以不支持传入切片到可变参数中;

- 示例:

func fun(nums ...int) {
    for k, v := range nums {
        fmt.Println(k, v)
    }
}

 

匿名函数

- 匿名函数:支持将函数赋值给变量, 也可以将函数作为其他函数的参数或返回值;

  - 赋值给变量:

func main() {  
    a := func() {
        fmt.Println("hello world first class function")
    }
    a()
    fmt.Printf("%T", a)
}

 

   - 直接调用:

func main() {  
    func() {
        fmt.Println("hello world first class function")
    }()
}

 

- 高阶函数: 

  - 满足下面两个任意一个条件的函数,被称为高级函数:

    - 接受一个或多个函数作为参数;

      - 示例:

package main

import (  
    "fmt"
)

// 定义的接受函数为参数的函数
func simple(a func(a, b int) int) {  
    fmt.Println(a(60, 7))
}

func main() {  
    // 匿名函数
    f := func(a, b int) int {
        return a + b
    }
    simple(f)
}
示例

    - 返回值是一个函数;

      - 示例:

package main

import (  
    "fmt"
)

func simple() func(a, b int) int {  
    f := func(a, b int) int {
        return a + b
    }
    return f
}

func main() {  
    s := simple()
    fmt.Println(s(60, 7))
}
示例

 

- 闭包:

  - python中的装饰器类似:

  - 调用函数外部的变量;

package main

import (  
    "fmt"
)

func appendStr() func(string) string {  
    t := "Hello"
    c := func(b string) string {
        t = t + " " + b
        return t
    }
    return c
}

func main() {  
    a := appendStr()
    b := appendStr()
    fmt.Println(a("World"))
    fmt.Println(b("Everyone"))

    fmt.Println(a("Gopher"))
    fmt.Println(b("!"))
}
posted @ 2018-10-30 21:54  浮生凉年  阅读(186)  评论(0编辑  收藏  举报