最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言中的函數(shù)式編程實踐

 更新時間:2018年05月29日 09:52:46   作者:Oo若離oO  
這篇文章主要介紹了Go語言中的函數(shù)式編程實踐,主要講解Go語言中的函數(shù)式編程概念和使用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文主要講解Go語言中的函數(shù)式編程概念和使用,分享給大家,具體如下:

主要知識點:

  1. Go語言對函數(shù)式編程的支持主要體現(xiàn)在閉包上面
  2. 閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,所以閉包可以理解成“定義在一個函數(shù)內(nèi)部的函數(shù)“。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁。
  3. 學習閉包的基本使用
  4. 標準的閉包具有不可變性:不能有狀態(tài),只能有常量和函數(shù),而且函數(shù)只能有一個參數(shù),但是一般可以不用嚴格遵守
  5. 使用閉包 實現(xiàn) 斐波那契數(shù)列
  6. 學習理解函數(shù)實現(xiàn)接口
  7. 使用函數(shù)遍歷二叉樹

具體代碼示例如下:

package main

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

//普通閉包
func adder() func(int) int {
 sum := 0
 return func(v int) int {
 sum += v
 return sum
 }
}

//無狀態(tài) 無變量的閉包
type iAdder func(int) (int, iAdder)
func adder2(base int) iAdder {
 return func(v int) (int, iAdder) {
 return base + v, adder2(base + v)
 }
}

//使用閉包實現(xiàn) 斐波那契數(shù)列
func Fibonacci() func() int {
 a, b := 0, 1
 return func() int {
 a, b = b, a+b
 return a
 }
}

//為函數(shù) 實現(xiàn) 接口,將上面的方法 當作一個文件進行讀取
type intGen func() int
//為所有上面這種類型的函數(shù) 實現(xiàn)接口
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)

 // TODO: incorrect if p is too small!
 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() {
 //普通閉包調(diào)用
 a := adder()
 for i := 0; i < 10; i++ {
 var s int =a(i)
 fmt.Printf("0 +...+ %d = %d\n",i, s)
 }
 //狀態(tài) 無變量的閉包 調(diào)用
 b := adder2(0)
 for i := 0; i < 10; i++ {
 var s int
 s, b = b(i)
 fmt.Printf("0 +...+ %d = %d\n",i, s)
 }

 //調(diào)用 斐波那契數(shù)列 生成
 fib:=Fibonacci()
 fmt.Println(fib(),fib(),fib(),fib(),fib(),fib(),fib(),fib())


 var f intGen = Fibonacci()
 printFileContents(f)
}

以下代碼演示函數(shù)遍歷二叉樹:

package main
import "fmt"
type Node struct {
 Value  int
 Left, Right *Node
}

func (node Node) Print() {
 fmt.Print(node.Value, " ")
}

func (node *Node) SetValue(value int) {
 if node == nil {
 fmt.Println("Setting Value to nil " +
 "node. Ignored.")
 return
 }
 node.Value = value
}

func CreateNode(value int) *Node {
 return &Node{Value: value}
}

//為 TraverseFunc 方法提供 實現(xiàn)
func (node *Node) Traverse() {
 node.TraverseFunc(func(n *Node) {
 n.Print()
 })
 fmt.Println()
}
//為 Node 結(jié)構(gòu)增加一個方法 TraverseFunc ,
//此方法 傳入一個方法參數(shù),在遍歷是執(zhí)行
func (node *Node) TraverseFunc(f func(*Node)) {
 if node == nil {
 return
 }
 node.Left.TraverseFunc(f)
 f(node)
 node.Right.TraverseFunc(f)
}


func main() {
 var root Node
 root = Node{Value: 3}
 root.Left = &Node{}
 root.Right = &Node{5, nil, nil}
 root.Right.Left = new(Node)
 root.Left.Right = CreateNode(2)
 root.Right.Left.SetValue(4)
 root.Traverse() // 進行了 打印封裝

 //以下通過匿名函數(shù),實現(xiàn)了 自定義實現(xiàn)
 nodeCount := 0
 root.TraverseFunc(func(node *Node) {
 nodeCount++
 })
 fmt.Println("Node count:", nodeCount) //Node count: 5
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • 一文詳解Go語言中切片的底層原理

    一文詳解Go語言中切片的底層原理

    在Go語言中,切片作為一種引用類型數(shù)據(jù),相對數(shù)組而言是一種動態(tài)長度的數(shù)據(jù)類型,使用的場景也是非常多,所以本文主要來和大家聊聊切片的底層原理,需要的可以參考一下
    2023-06-06
  • 如何避免Go語言常見錯誤之意外的變量隱藏

    如何避免Go語言常見錯誤之意外的變量隱藏

    在Go語言中,變量隱藏(Variable Shadowing)是一個常見的錯誤來源,變量隱藏發(fā)生在一個內(nèi)部作用域中聲明的變量與外部作用域的變量同名時,這可能導致開發(fā)者無意中使用了錯誤的變量,造成難以追蹤的bug,本文講解一些關(guān)于變量隱藏的常見錯誤和如何避免它們的方法
    2024-01-01
  • Go?語言前綴樹實現(xiàn)敏感詞檢測

    Go?語言前綴樹實現(xiàn)敏感詞檢測

    這篇文章主要為大家介紹了Go語言前綴樹實現(xiàn)敏感詞檢測實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go語言實現(xiàn)AES加密的方法

    go語言實現(xiàn)AES加密的方法

    這篇文章主要介紹了go語言實現(xiàn)AES加密的方法,實例分析了Go語言的加密技巧,需要的朋友可以參考下
    2015-03-03
  • 重學Go語言之JSON操作詳解

    重學Go語言之JSON操作詳解

    JSON的全稱是Javascript?Object?Notation,是一種數(shù)據(jù)結(jié)構(gòu)化交互的標準協(xié)議,這篇文章主要是來和大家介紹一下Go語言中JSON的相關(guān)操作,需要的可以參考下
    2023-08-08
  • Go構(gòu)建高性能的事件管理器實例詳解

    Go構(gòu)建高性能的事件管理器實例詳解

    這篇文章主要為大家介紹了Go構(gòu)建高性能的事件管理器實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 詳解如何通過Go來操作Redis實現(xiàn)簡單的讀寫操作

    詳解如何通過Go來操作Redis實現(xiàn)簡單的讀寫操作

    作為最常用的分布式緩存中間件——Redis,了解運作原理和如何使用是十分有必要的,今天來學習如何通過Go來操作Redis實現(xiàn)基本的讀寫操作,需要的朋友可以參考下
    2023-09-09
  • Go語言函數(shù)的延遲調(diào)用(Deferred Code)詳解

    Go語言函數(shù)的延遲調(diào)用(Deferred Code)詳解

    本文將介紹Go語言函數(shù)和方法中的延遲調(diào)用,正如名稱一樣,這部分定義不會立即執(zhí)行,一般會在函數(shù)返回前再被調(diào)用,我們通過一些示例來了解一下延遲調(diào)用的使用場景
    2022-07-07
  • go語言base64加密解密的方法

    go語言base64加密解密的方法

    這篇文章主要介紹了go語言base64加密解密的方法,實例分析了Go語言base64加密解密的技巧,需要的朋友可以參考下
    2015-03-03
  • sublime text3解決Gosublime無法自動補全代碼的問題

    sublime text3解決Gosublime無法自動補全代碼的問題

    本文主要介紹了sublime text3解決Gosublime無法自動補全代碼的問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

镇雄县| 万盛区| 江都市| 河间市| 容城县| 东乡族自治县| 金沙县| 庆元县| 安庆市| 瓮安县| 中山市| 德令哈市| 凤山市| 古丈县| 嘉定区| 当雄县| 陆川县| 夏津县| 济宁市| 韶关市| 孟连| 汝阳县| 南丰县| 普安县| 安康市| 新野县| 冕宁县| 改则县| 玛多县| 宁明县| 大方县| 永德县| 沁阳市| 和田县| 青海省| 大宁县| 临桂县| 吉林省| 大石桥市| 盐池县| 泉州市|