高级数据类型,仅仅是做个概念认识,等到其他相关知识的学习时,再着重分析。
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
有疑问加站长微信联系(非本文作者)