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

hnxxwyq · · 1211 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

高级数据类型,仅仅是做个概念认识,等到其他相关知识的学习时,再着重分析。

 

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


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:hnxxwyq

查看原文:Go学习笔记之高级数据类型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1211 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传