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