博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

GO 中各种函数的应用

Posted on 2018-08-21 10:22  猪_哥  阅读(278)  评论(0)    收藏  举报
很久以前做的笔记,整理一下,分享出来。。。。
 
/*
函数的使用:
A. "无"返回值 函数
B. “有”返回值 函数
C. 多态:回调函数
D. 闭包
*/
 
 
package Bfunction

 

import (
    "fmt"
)

 

// 通过 Main函数 调用 运行函数
func TestRun() {
    //定义参数: Slice
    //args := []int{7, 5, 8, 66, 55, 24}

 

    //调用 无返回值: 传参: func03
    //func0(args...)

 

    //调用 有返回值 参数
    // str := func03()
    // fmt.Println(str)
    //输出返回的值
    // fmt.Println(func04())

 

    //调用 有参数有返回值
    // max, min := func05(3, 8)
    // fmt.Printf("max 是 %d, min 是 %d\n", max, min)

 

    // 使用_占位符:即不需要的数,可通过 _ 点位符丢弃
    // max01, _ := func05(6, 20)
    // fmt.Printf("两个数中的大数是:%d\n", max01)

 

    //调用回调函数: 计算器
    //(只修改调用 的参数,即可 实现 同一个调用函数,不同的执行结果)
    //resuft := Calc(3, 8, add) //传递 add 执行 加法
    // resuft := Calc(10, 8, Minus) //传递 Minus 执行 减法
    // fmt.Println("resuft=", resuft)

 

    //调用 闭包 函数
    testRun()

 

}

 

/*----------------------------------------------------------------------*/
//A."无"返回值 函数 调用

 

//接收不定参的传递,及转发传递
func func0(args ...int) {

 

    //Func02(args...)     //按args原样传递全部元素
    /*
     1.其本质上是Slice切片;(ars[:]...)(args[:(len)-1]...)都合法
     2.参数后面的 ... 不能丢
    */
    Func02(args[3:]...) //从args[3]开始(包括索引为3的元素)到后面所有元素传递过去
    Func02(args[:5]...) //从args[0]至args[5](但不包括 元素args[5] 传递过去
}

 

//多个参数类型
func Func01(a int, b string, c float32) { //参数中也可以用 (a ,b int,c string)
    fmt.Printf("a=%d,b=%s,c=%v\n", a, b, c)

 

}

 

// ...type 不定参数类型
func Func02(args ...int) {
    //获取参数的个数
    fmt.Println("len(args)=", len(args))
    //获取每个参数
    // for i := 0; i < len(args); i++ {
    //  fmt.Printf("args[%d]=%d\n", i, args[i])
    // }

 

    //通过 迭代 输出参数
    for i, data := range args { //遍历参数列表
        fmt.Printf("args[%d]=%d\n", i, data)
    }
}

 

/*-------------------------------------------------------------------*/

 

//B. “有”返回值 函数

 

//无参,有一个返回值 官方推荐给返回值"命名";
func func03() (resuft string) {
    //赋值
    resuft = "一个返回值"
    return
}

 

//无参 多个返回值
func func04() (a, b, c int) { // 等价于 返回值(int,int,int)
    //赋值
    a, b, c = 10, 20, 30

 

    //直接返回
    return
}

 

//定义函数: 两个数比较大小
func func05(a, b int) (max, min int) {
    if a > b {
        max = a
        min = b
    } else {
        max = b
        min = a
    }
    return
}

 

/*----------------------------------------------------------------------*/
//C. 多态:回调函数
//回调函数即 有一个参数是函数类型,即回调函数
//调用同一个接口,不同的表现,即 多态
//通过使用 函数 类型的变量,可以先将调用写上,以后再 将 调用 的方法本体完善

 

type funcType func(int, int) int //定义一个函数类型

 

//实现一个 加法
func add(a, b int) int {
    return a + b
}

 

//实现一个 减法
func Minus(a, b int) int {
    return a - b
}

 

//定义计算器的函数 通过 函数类型的参数,实现 回调函数
func Calc(a, b int, F funcType) (result int) {
    //F 这个函数并没有实现,可以先调用着
    result = F(a, b)
    return
}

 

/*----------------------------------------------------------------------*/

 

//D. 闭包函数
//返回一个匿名函数类型
func func06() func() int {
    var a int //初始值是0
    return func() int { //闭包函数
        a++
        return a * a
    }
}

 

//调用上面的函数
//特点:闭包函数使用的a变量,只要闭包还在使用它,它就不会被释放;即:不关心作用域
func testRun() {
    f := func06()
    x1 := f() //通过f来调用闭包函数
    x2 := f()
    x3 := f()
    x4 := f()
    fmt.Printf("x1=%d,x2=%d,x3=%d,x3=%d", x1, x2, x3, x4)
    //输出:x1=1,x2=4,x3=9,x3=16
}

 

/*----------------------------------------------------------------------*/