美文网首页golang 学习与实战
【Golang 基础】 Go 语言 函数式编程

【Golang 基础】 Go 语言 函数式编程

作者: hvkcoder | 来源:发表于2019-03-28 22:16 被阅读0次

    Go 语言函数式编程

      在 Go 语言中函数是一等公民,它作为一个变量、类型、参数、返回值,甚至可以去实现一个接口,但是 Go 语言中函数不支持重载、嵌套和默认参数。

    • 通过使用 func 关键字来定义函数
    package main
    
    func main(){
        
    }
    

    函数支持的特性

    • 作为变量;
    func test(){
        // 函数体
    }
    
    funcTest := test
    
    fmt.Println(funcTest())
    
    • 匿名函数
    test := func(){
        // 函数体
    }
    
    • 作为类型;
    package main
    
    import "fmt"
    
    type iAdder func(int, int) int
    
    func main(){
        var adder iAdder = func(a int, b int) int {
            return a + b
        }
        
        fmt.Println(adder(1,2)) // 3
    }
    
    • 不定长度变参;
    func test(num ...int){
        fmt.Println(num) // [1 2 3 4]
    }
    
    test(1,2,3,4)
    
    • 多返回值;
    func test() (string,int,bool){
        return "Hello World", 100, true
    }
    
    v1, v2, v3 := test()
    
    fmt.Println(v1, v2, v3) // Hello World 100 true
    
    • 命名返回值参数;
    func test() (a string, b bool, c int) {
        a = "Golang"
        b = false
        c = 200
        return
    }
    
    v1, v2, v3 := test()
    
    fmt.Println(v1, v2, v3) // Golang false 200
    
    • 闭包
    package main
    
    import "fmt"
    
    // 使用 闭包实现 斐波那契数列
    func fibonacci() func() int {
        a, b := 0, 1
    
        return func() int {
            a, b = b, a +b
            return a
        }
    }
    
    func main(){
        f := fibonacci()
    
        fmt.Println(f()) // 1
        fmt.Println(f()) // 1
        fmt.Println(f()) // 2
        fmt.Println(f()) // 3
        fmt.Println(f()) // 5
    }
    
    • 使用函数实现接口

      还是以 斐波那契数列为例,将其当做一个文件流来读取.

    package main
    
    import (
        "fmt"
        "io"
        "bufio"
        "strings"
    )
    
    // 使用 闭包实现 斐波那契数列
    func fibonacci() intGen {
        a, b := 0, 1
        return  func() int {
            a, b = b, a + b
            return a
        }
    }
    
    // 定义一个类型
    type intGen func() int
    
    // 实现一个 Reader 接口
    func (g intGen) Read(p []byte) (n int, err error) {
        // 获取下一个元素值
        next := g()
        if next > 10000 {
            return  0, io.EOF
        }
        // 将一个数值转为字符串
        s := fmt.Sprintf("%d/n", next)
        return strings.NewReader(s).Read(p)
    }
    
    // 使用 Reader 读取的方法
    func printFileContents(reader io.Reader){
        scanner := bufio.NewScanner(reader)
        for scanner.Scan()  {
            fmt.Println(scanner.Text())
        }
    }
    
    
    func main(){
        f := fibonacci()
        
        printFileContents(f)
    }
    
    

    相关文章

      网友评论

        本文标题:【Golang 基础】 Go 语言 函数式编程

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