下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 13 | Go语言的函数
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Go语言从入门到实战

共55讲 · 55课时,约700分钟
6124
免费
01 | Go语言课程介绍
免费
02 | 内容综述
免费
03 | Go语言简介:历史背景、发...
免费
04 | 编写第一个Go程序
免费
05 | 变量、常量以及与其他语言...
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言...
12 | 字符串
13 | Go语言的函数
14 | 可变参数和defer
15 | 行为的定义和实现
16 | Go语言的相关接口
17 | 扩展与复用
18 | 不一样的接口类型,一样的...
19 | 编写好的错误处理
20 | panic和recover
21 | 构建可复用的模块(包)
22 | 依赖管理
23 | 协程机制
24 | 共享内存并发机制
25 | CSP并发机制
26 | 多路选择和超时
27 | channel的关闭和广播
28 | 任务的取消
29 | Context与任务取消
30 | 只运行一次
31 | 仅需任意任务完成
32 | 所有任务完成
33 | 对象池
34 | sync.pool对象缓存
35 | 单元测试
36 | Benchmark
37 | BDD
38 | 反射编程
39 | 万能程序
40 | 不安全编程
41 | 实现pipe-filter framew...
42 | 实现micro-kernel frame...
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结束语
本节摘要
展开

精选留言(19)

  • PHPer表示,看GO的这个func a(inner func(op int) int ) func (op int)需要速效救心丸……

    作者回复: 放轻松,其实就是函数是可以作为参数和返回值的。

    5
  • 2019-06-07
    函数的输入输出参数类型都没讲清楚,就结束了,
    3
  • 2019-06-05
    初学语言,用中文做了一下解释,有利于理解这个柯里化一样的东西
    ```
    // 延时一秒后返回入参
    func SlowFun(op int) int {
        time.Sleep(time.Second * 1)
        return op
    }

    // 定义一个函数timeSpent帮助记录入参函数的执行耗时
    // 入参是一个函数, 返回也是一个函数
    func timeSpent(入参函数名 func(op int) int) func(op int) int {
        return func(返回函数的参数 int) int {
            start := time.Now()
            ret := 入参函数名(返回函数的参数) // 执行有入参的该函数
            fmt.Println("该入参函数执行结果:", ret)
            fmt.Println("时间损耗:", time.Since(start).Seconds())
            return ret
        }
    }

    func TestFn(t *testing.T) {
        // 给timeSpent入参一个函数, 我们返回一个函数, 这个函数执行这个入参函数并打印该的执行时间
        // tsSF 得到的就是返回的函数,我们给这个函数提供一个 「返回函数的参数」-> 10
        tsSF := timeSpent(SlowFun)
        // 打印执行
        t.Log(tsSF(10))
    }
    ```
    展开
    2
  • 2019-03-26
    rand.Intn(10)最终的每次执行都是相同的值(我这里是1),如果改为rand.Intn(20)每次执行都返回11,为什么不是随机的呢?

    作者回复: 可以把完整的代码贴出来吗?

    2
  • 2019-09-16
    老师讲的需要再深入一些
    1
  • 老师您好,这次函数包装的练习,我的单侧没有run test的功能,您的是怎么调用出来的呢?
    一直提示如下:
    exported function TestGun should have comment or be unexported
    code:
    func TestGun(t *testing.T) {
        newGun := toolBoostGun(ju)
        t.Log(newGun(10))
    }
    辛苦老师解答,困惑许久。
    展开

    作者回复: 你的文件名是以_test结尾的吗?

    1
  • 2019-04-10
    老师好,看完这节对函数式编程有了一定的理解,对于func timespend(inner func(op1 int) int) func(op2 int) int这个方法,这个方法虽然有了一定的复用性,但是也只能用到只有1个参数为int、只有1个返回值也为int的情况,如果参数或返回值发生了变化,那么这个方法将不再适用,得重写另一个方法,请问能实现忽略方法的参数和返回值去进行复用吗?

    作者回复: 你可以将定义做的适当灵活些,如将入参类型定义为interface{},多个参数可以通过结构传入

    1
  • 2019-03-14
    老师,go函数以函数作为参数和作为返回值,是否类似于c++里传递了函数指针,通过包装将原本单一功能的函数提供额外的能力

    作者回复: 是的。其实这是Go对函数式编程的支持

    1
  • 2019-12-05
    老师的一句装饰者模式,让我豁然开朗。后面那三行代码也可以一行调用:timeSpent(slowFn)(10)

    作者回复: 👍

  • 2019-11-19
    假如我传入的函数返回值不是int,这个计算时间的方法就没用了吧?

    作者回复: 是的。

  • 2019-08-29
    May I define the function like the below by removing "op"?

    func myfunc(inner func(int) int) func(int) int {
    }

    作者回复: please,try it. You would get the answer;)

  • 2019-08-12
    这次课讲的太短了,没看懂整个代码,代码里的return func(n int) int 这个对应的是哪个呢?传入参数n打印了下,是下面tsSF(10)里的这个10,可是这个10是怎么传入函数的,怎么就跟n int对应上了呢?还有就是    tsSF := timeSpent(slowFun) 这一行也是没有看懂啥意思。

    作者回复: 这节主要是讲functional programming,函数可以作为返回值和参数 。 其中:tsSF是个函数,如下
    func(n int) int {
            start := time.Now()
            ret := inner(n)
            fmt.Println("time spent:", time.Since(start).Seconds())
            return ret
        }

    如果你还是不是特别明白,推荐你看看我讲座中推荐的书籍关于functional programming的。

  • 2019-05-27
    和浪迹天涯的问题一样,每次运行都打印1,7,一点不随机。网上说想每次不一样得先后调用rand.NewSource(), rand.New()等方法。😯

    作者回复: 这是因为这里是伪随机数,你可以在前面加上下一行
    rand.Seed(time.Now().UnixNano())

  • 2019-04-26
    /**
    输入是一个函数类型,返回是一个函数类型

    func timeSpent(inner func(op int) int --> 函数类型) func(op int) int --> 函数类型

     */
    func timeSpent(inner func(op int) int) func(op int) int {

        //返回一个函数
        return func(n int) int {
            start := time.Now()
            ret := inner(n) //调用传入的函数

            fmt.Println("time spent:", time.Since(start).Seconds())
            return ret
        }
    }
    展开
  • 2019-04-25
    老师您好!请问 ret := inner(n) 中的 inner 是什么意思啊?是一个内置函数吗?

    作者回复: inner不是Go内置的函数,而是一个自定义函数作为参数传入

  • 2019-03-19
    感觉函数这里能不能再细一点。或者多写几个例子
  • 2019-03-18
    还是Vim好。 go的插件就一个fatih/vim-go。
  • 2019-03-14
    编辑器我觉得还是用Jetbrains家的GoLand舒服点,函数传值时都会显示是用的是哪个函数的形参。对新手帮助很大,加深理解。

    func TestFunc(t *testing.T) {
        tsSF := timespend(slowFunc) // 返回一个新的函数
        fmt.Println(tsSF(222)) // op2: 222
        t.Log(timespend(slowFunc)(222)) // op2: 222

    }

    func slowFunc(op int) int {
        time.Sleep(time.Second * 2)
        return op
    }

    func timespend(inner func(op1 int) int) func(op2 int) int {
        fmt.Println(inner(111)) // op1: 111
        return func(op3 int) int {
            start := time.Now()
            ret := inner(op3)
            fmt.Println("time spent:", time.Since(start).Seconds())
            return ret
        }
    }
    展开

    作者回复: 很赞的反馈.你的留言可以帮助很多同学!

  • 2019-03-12
    希望例子能够更多一些,也希望穿插讲一讲函数式编程的思维模式

    作者回复: 函数式编程涉及的知识很多,有机会我们做个专题来讲