您的位置:首页 > 编程语言 > Go语言

Go学习笔记之高级数据类型

2013-05-29 11:06 375 查看
高级数据类型,仅仅是做个概念认识,等到其他相关知识的学习时,再着重分析。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: