六、Go编程语言中的函数式编程
@Author:Runsen
任何編程語言都是眾所周知的面向?qū)ο缶幊?#xff0c;還有日漸流行的函數(shù)式編程,當(dāng)然Go也不例外,這也是本文的重點.。我可以這么說,Go的功力深不深完全就是看函數(shù)式編程和面向?qū)ο缶幊獭?/p>
下面,Runsen先介紹Go編程語言中的函數(shù)式編程。
文章目錄
- 普通函數(shù)
- 匿名函數(shù)
- 閉包函數(shù)
Go中函數(shù)就是一類帶特殊的 接收者 參數(shù)的函數(shù)。函數(shù)接收者在它自己的參數(shù)列表內(nèi),位于 func 關(guān)鍵字和方法名之間。
函數(shù)對應(yīng)操作序列,是程序的基本組成元素。Go語言中的函數(shù)有具名和匿名之分。
普通函數(shù):一般對應(yīng)于包級的函數(shù),是匿名函數(shù)的一種特例。(個人理解:指明函數(shù)名稱、參數(shù)、返回值、有具體函數(shù)體)
匿名函數(shù):隱藏函數(shù)名稱(這里我覺得和JavaScript很像)
閉包函數(shù):當(dāng)匿名函數(shù)引用了外部作用域中的變量時就成了閉包函數(shù),閉包函數(shù)是函數(shù)式編程語言的核心。
下面是函數(shù)的具體形式。
func function_name( [parameter list] ) [return_types] {函數(shù)體 }- func:函數(shù)由 func 開始聲明
- function_name:函數(shù)名稱,函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名。
- parameter list:參數(shù)列表,參數(shù)就像一個占位符,當(dāng)函數(shù)被調(diào)用時,你可以將值傳遞給參數(shù),這個值被稱為實際參數(shù)。參數(shù)列表指定的是參數(shù)類型、順序、及參數(shù)個數(shù)。參數(shù)是可選的,也就是說函數(shù)也可以不包含參數(shù)。
- return_types:返回類型,函數(shù)返回一列值。return_types 是該列值的數(shù)據(jù)類型。有些功能不需要返回值,這種情況下 return_types 不是必須的。
函數(shù)體:函數(shù)定義的代碼集合。
普通函數(shù)
函數(shù)的函數(shù)名首字母的大小寫體現(xiàn)函數(shù)的可見性,很重要記住這樣一個規(guī)則:小寫字母開頭的函數(shù)只在本包內(nèi)可見,大寫字母開頭函數(shù)才能被其他包調(diào)用。這里我必須強(qiáng)調(diào)這一點。
下面是案例完整代碼
package mainimport ("fmt" )func main() {a,b:=who("Runsen",20)fmt.Println(a,b) // Runsen 20 }func who(name string, age int) (string, int) {return name, age }匿名函數(shù)
匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,由一個不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成
下面我們看一個示例。
package mainimport ("fmt" ) func main() {// 不帶函數(shù)名 匿名函數(shù)直接賦值給一個變量:who:=func (name string, age int) (string, int) {return name, age}a,b:=who("Runsen",20)fmt.Println(a,b) //Runsen 20 }下面是一個計算從 1 到 1 百萬整數(shù)的總和的匿名函數(shù):
func() {sum := 0for i := 1; i <= 1e6; i++ {sum += i} }()閉包函數(shù)
對于閉包函數(shù),我相信很多都不知道,這里我們先看Python一個閉包函數(shù)。
def fun1():sum = 0def fun2(v):nonlocal sumsum += vreturn sumreturn fun2a = fun1() for i in range(10):print(a(i))0 1 3 6 10 15 21 28 36 45代碼解析:fun1返回的不是一個值,而是一個函數(shù)fun2, a = fun2,所以 a(i)會打印 sum的值,為什么 sum 一直在加呢,函數(shù)里的值為什么可以帶到函數(shù)體外呢。
其實可以把閉包看做一個類, sum 就是類里的屬性, fun2就是類的方法,所以fun2可以使用 sum(自由變量)
nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數(shù)內(nèi)的變量。嵌套函數(shù)fun2中的sum受到了影響,顯示fun2中的sum是fun1函數(shù)中的局部變量。
下面給出Go語言閉包函數(shù)的定義:當(dāng)匿名函數(shù)引用了外部作用域中的變量時就成了閉包函數(shù),閉包函數(shù)是函數(shù)式編程語言的核心。
也就是匿名函數(shù)可以會訪問其所在的外層函數(shù)內(nèi)的局部變量。當(dāng)外層函數(shù)運行結(jié)束后,匿名函數(shù)會與其使用的外部函數(shù)的局部變量形成閉包。
下面是具體閉包函數(shù)示例代碼:
func adder() func(int) int {var x intreturn func(y int) int {x += yreturn x} } func main() {var f = adder()fmt.Println(f(10)) //10fmt.Println(f(20)) //30fmt.Println(f(30)) //60f1 := adder()fmt.Println(f1(40)) //40fmt.Println(f1(50)) //90 }將 adder()函數(shù)賦值給變量f,那么f(10)就相當(dāng)于執(zhí)行其內(nèi)部的匿名函數(shù)func(y int)。
所以f(10)其實執(zhí)行的是x = x+y ,此時x沒有給值默認(rèn)為0,y為10,最終返回x的值是10。
f(20)同樣執(zhí)行其內(nèi)部的匿名函數(shù)func(y int),所以f(20)其實執(zhí)行的是x = x+y。此時x已經(jīng)是10,y為20,最終返回x的值是30,依次類推執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的六、Go编程语言中的函数式编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡容时还款要申请吗
- 下一篇: 七、Go 语言面向对象编程