• 熊大棒@KONAKONA
    2019-05-01
    PHPer表示,看GO的这个func a(inner func(op int) int ) func (op int)需要速效救心丸……

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

    
     6
  • 梧桐
    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))
    }
    ```
    展开
    
     4
  • 杨宇铎(duo)
    2019-06-07
    函数的输入输出参数类型都没讲清楚,就结束了,
    
     3
  • 浪迹天涯
    2019-03-26
    rand.Intn(10)最终的每次执行都是相同的值(我这里是1),如果改为rand.Intn(20)每次执行都返回11,为什么不是随机的呢?

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

    
     2
  • jimmy
    2019-09-16
    老师讲的需要再深入一些
    
     1
  • 大名府卢员外
    2019-04-11
    老师您好,这次函数包装的练习,我的单侧没有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
  • Flygar
    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
        }
    }
    展开

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

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

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

    
     1
  • 王宇
    2020-02-10
    之前看过js的函数编程,一个意思,思想一样,还有注解的实现也对函数前置后置的行为处理
    
    
  • WING
    2019-12-05
    老师的一句装饰者模式,让我豁然开朗。后面那三行代码也可以一行调用:timeSpent(slowFn)(10)

    作者回复: 👍

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

    作者回复: 是的。

    
    
  • Hao
    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;)

    
    
  • Geek_338030
    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的。

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

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

    
    
  • kubernetes
    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
    感觉函数这里能不能再细一点。或者多写几个例子
    
    
  • Griffin
    2019-03-18
    还是Vim好。 go的插件就一个fatih/vim-go。
    
    
  • 天津小度
    2019-03-12
    希望例子能够更多一些,也希望穿插讲一讲函数式编程的思维模式

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

    
    
我们在线,来聊聊吧