偷学golang(三)

继续偷学,该面向对象了。

golang有面向对象,但是没有类,是通过把方法绑到结构体上实现的。

当时学C和C++的时候,就知道其实结构体加上函数其实就和类差不多了。但是真的做成这个样子还是挺稀奇的,感觉这门语言真是为了减少关键字数量无所不用其极。

方法

方法就是一类带有特殊的接收者参数的函数,这个接收者是结构体类型的实例。位置在func关键字和方法名之间,用小括号括起来。

教程里甚至强调了方法就是函数,加了个接收者参数感觉也就是用来引用接收者的属性比较好使,把它直接扔到参数列表里感觉都可以。

可以为除了结构体外的其他类型定义方法,接收者的类型定义和方法声明需要在同一个包里。不能为内建类型声明方法。但看着好像可以用type关键字改个名字来用?

方法所绑定的接收者结构体要是被别的结构体包含了,那么就有点像继承的意思,方法也就被继承了。当然内层结构体里的字段也可以使用。匿名字段在golang中大概就是这么使用的。之所以叫匿名字段,因为在包含的过程中,只写了结构体类型名称,没有把详细的字段列出来。

方法集大概只是一种概念,大概就是两条准则,第一条是,如果接收者实例是T,那么它可以使用所有接收者是T的方法。第二条是,如果接收者实例是*T,那么它可以使用所有接收者是T和*T的方法。你可以根据上面的匿名字段继承那块的知识进一步推论出另外两条结论:当包含T,可以用接收者是T的方法,包含*T,可以用接收者是T和*T的方法。

表达式:啥玩意儿?

接口:这个概念和其他的一样,都是要求实现的一组规范。定义了应该有什么功能,至于到底怎么实现这些功能它是不关心的,只要有就好。首先要记住接口是一个类型,相当于是一组方法定义的集合。规定了方法的参数列表和返回值,具体的实现内容并没有涉及。举个例子:

type writer interface{
    Write([]byte) error
}

一般接口的名字结尾都要加上er。

接口的实现很简单,不用有什么引入的步骤,只要结构体能够把接口中列出的方法全部都实现了,就说明接口被实现了。(那么强制性显示在哪里?像是我代码只实现了一部分接口方法,会报错吗)

实现了接口的对象能够被存放在接口里面。先跳了,这块没太看懂。