美文网首页
go 的函数式编程

go 的函数式编程

作者: OOM_Killer | 来源:发表于2019-08-01 23:37 被阅读0次

在 go 语言中,函数是一等公民。函数既可以作为参数传入,也可以作为返回值返回。
go 语言的函数式编程最典型的例子就是 闭包。

闭包是什么呢?

简单讲,闭包就是指有权访问另一个函数作用域中的变量的函数。
它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。
外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。

闭包
package main

import "fmt"

func fib() func() int {
    a,b := 0,1
    return func() int {
        b,a = a+b,b
        return b
    }
}

func main() {
    f := fib()
    for i := 0 ; i < 20;i++ {
        fmt.Printf("%d ",f())
    }
}
// 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946
为函数生成接口

上面的例子中,f() 是每执行一遍的话 ,会生成一个新的斐波那契数。可以把他实现成为一个read的接口。那么就可以使用 scanner.Scan()。像读文件一样打印斐波那契数列。

package main

import (
    "bufio"
    "fmt"
    "io"
    "strings"
)

func fib() IntGen {
    a,b := 0,1
    return func() int {
        b,a = a+b,b
        return b
    }
}

type IntGen func() int

func (g IntGen) Read(p []byte) (n int,err error) {
    next := g()
    if next > 1000000 {
        return 0,io.EOF
    }
    s := fmt.Sprintf("%d ",next)
    return strings.NewReader(s).Read(p)
}

func PrintFib(read io.Reader) {
    scanner := bufio.NewScanner(read)

    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}
func main() {
    f := fib()
    PrintFib(f)
} 
传入函数来解决问题

假设现在有一个遍历二叉数的函数。他只是做了打印的操作,那能否使用之前的所学到的知识,再丰富其功能呢。

func (t *TreeNode) Traverse() {
    if t == nil {
        return
    }

    t.Left.Traverse()
    fmt.Println(t.Val)
    t.Right.Traverse()
}

用闭包改造后,不仅可以打印出每一个值,而且可以打印出一共有多少个节点。

func (t *TreeNode) Traverse() {
    cnt := 0
    t.TraverseFunc(func(node *TreeNode) {
        fmt.Printf("%d ",node.Val)
        cnt ++
    })
    fmt.Println("\nNode cnt is",cnt)
}

func (t *TreeNode) TraverseFunc(f func (*TreeNode) ) {
    if t == nil {
        return
    }

    t.Left.TraverseFunc(f)
    f(t)
    t.Right.TraverseFunc(f)
}

相关文章

  • Go 函数式编程实战

    Go 函数式编程实战-目录 序致谢前言关于本书关于作者 函数式编程简介1.1 函数概述1.2 什么是函数式编程1....

  • GO学习笔记(12)-斐波那契数列与函数编程

    目录 函数指针 vs 函数式编程 闭包 斐波那契数列与函数接口 函数指针 vs 函数式编程 函数是go语言中的...

  • 函数式编程

    我们今天说的Go中的函数式编程主要是体现在闭包上面的,比如 我们首先对比两个概念 函数式编程 vs 函数指针 函数...

  • # Go 方法编程与面向对象

    上一节,我们看到 Go 函数特性及函数式编程风格。这一节,将会主要展示Go的方法特性及面向对象编程。什么是方法?当...

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • iOS 函数编程 & 链式编程

    函数式(链式)编程 函数式编程概念 函数式编程是种编程范式 函数式编程 Functional Programmin...

  • go 的函数式编程

    在 go 语言中,函数是一等公民。函数既可以作为参数传入,也可以作为返回值返回。go 语言的函数式编程最典型的例子...

  • 函数式编程(一)—— 前置知识

    为什么要学函数式编程? 什么是函数式编程?函数式编程和面向对象编程的不同对于函数式编程思维方式的理解: 函数式编程...

  • Python中的函数式编程

    函数式编程 说到函数式编程,我们的重点在于为什么要采用函数式编程,而不是什么是函数式编程。 函数式编程的优点:一、...

  • 二十二、函数式编程、面向协议式编程

    函数式编程(Functional Prigramming) 函数式编程 函数式编程(Functional Prig...

网友评论

      本文标题:go 的函数式编程

      本文链接:https://www.haomeiwen.com/subject/dtuhdctx.html