這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
進階資料類型,僅僅是做個概念認識,等到其他相關知識的學習時,再著重分析。
1 function
將 function 作為資料類型的語言有很多,函數式編程的核心理念。
function 是“第一等公民”,function 與其他資料類型一樣,處於平等地位,可以賦值給其他變數,也可以作為參數,傳入另外一個 function ,或者作為別的 function 的傳回值。
在 Go 語言中,進行賦值的首要條件是類型一致,function 賦值給其他變數的前提是,必須 function 簽名一致才認為是相同類型,否則編譯報錯。
這裡需要引入一個新的概念,函數簽名(即函數的類型簽名)。函數簽名就是一個函數不包含函數主體部分,也就是函數的參數類型和傳回值類型。例如
func func1(a int) int { // body}
則其函數簽名為
func1(int) int //可以不用包含形參名和返回結果名
例如
func test_func_signature() { var var1 func(int) int var var2 func(a int) int var var3 func(b int) int var1 = func1 var2 = func1 var3 = func1 fmt.Printf("%s", var1) // 三者輸出一致 fmt.Printf("%s", var2) // 三者輸出一致 fmt.Printf("%s", var3) // 三者輸出一致}func func1(a int) int { return a}
由於 function 本身是資料,就可以同其他資料類型一樣複合成更加複雜的資料類型,例如閉包(嵌套function)和對象(自訂類型)。
對於對象的方法,用Rob Pike的話來說就是:
“A method is a function with an implicit first argument, called a receiver.“(方法就是一個有接受者的函數)
receiver 有一個限制,不能是內建基礎類型,只能是 type 關鍵字自訂的類型,但是有一個例外,自訂的 interface 是不能作為 receiver 。
2 interface
Go語言中 interface 同其他語言中 interface(介面) 不一樣,具體如下:
a、interface 也是“第一等公民”,也就是說 interface 其實也是一種資料類型。即能賦值給其他變數、作為參數和傳回值。
b、interface 是函數(簽名)的集合,不用像 JAVA 語言在需要實現 interface 的 class 上顯式聲明,只要需要某個類型包含了 interface 包含的函數集合,就能說該類型實現了這個interface。
c、interface 由於是函數的集合,也就是說面向的是能做為 function 的 receiver 的類型,而不像其他語言是面向 class 的。
interface 類型賦值時,只有類型相同才能賦值 ,否則會編譯報錯( cannot use AAA as type BBB in assignment), interface 類型怎麼確認類型相同?
只要具體類型的方法(函數)集合中包含 interface 所規定的方法(函數)集合(必須簽名一致,順序無所謂),就確認類型相同。
參考:
函數式編程初探-http://www.ruanyifeng.com/blog/2012/04/functional_programming.html