爱生活爱技术
记录编程学习笔记
© 爱生活爱技术

【7】Golang中方法与接口

方法能给用户定义的类型添加新的行为,方法实际以包含了接收者的函数。但是函数在go中不等同于方法。

方法

我们可以看到自定义了一个user类型,然后将这个类型作为接收者给了一个名为notify的函数。通过对user类型的初始化再调用该方法。

 

上面这个例子是值接收,如果使用值接收者声明方法,调用时会使这个值的一个副本来执行,那么当前值修改不会影响原来的值。接下来看下值接收和指针类型的接收有何区别。

 

我们能发现,使用指针接收者的方法时,这个方法会共享调用方法接收时接收者所指向的值。从而改变。

值接收者使用的值的副本来调用方法,而指针接收者使用实际的值来调用方法。


 

接口

接口定义着对象所具有的行为。

创建与实现接口

 

如果时使用指针接收者来实现一个接口,那么只有指向那个类型的指针才能实现相对应的接口。如果是使用的值接收者来实现接口的话,那么那个类型的值和指针都能够实现相对应的接口。接下来对上面的例子稍微改变即可看到指针作为接收者的不同。


 

多态

我们看下接口的多态案例,新增一个admin类型。

可以看到,user、admin两个实体类型都可以实现notify接口。

 

类型的嵌入

嵌入是将已经有的类型直接声明到新的结构体类型当中,被嵌入的类型被称为新的外部类型的内部类型。对外部类型来说,内部类型总是存在的,所以没有指定内部类型对应的字段名,我们还可以直接使用内部类型的类型名来访问。

 

看看接口是否如此

我们能看到下方案例,admin类型并没有实现该接口,通过user也是可以访问的。那么由于内部类型的提升,内部类型的接口会自动提升到外部类型。意味着由于内部类型的实现,外部类型同样可以实现该接口。

 

但是如果外部类型实现了notify方法,内部类型的实现将不会被提升。但是内部类型的值还一直存在,仍然可以直接访问方法。


 

标识符

当一个标识符的名称是以小写字母开头时,那么这个标识符是未公开的,包外不可访问;

当一个标识符的名称是以大写字母开头时,那么这个标识符就是公开的,包外可以访问。

爱生活爱技术-版权所有丨内容声明:未特别注明来源地址均为博主原创内容,转载请详细说明!本文链接地址:http://www.xioaxin12.xyz/1112.html
838 浏览数            
2018-12-22
关键字:
暂无评论

发表评论

湘ICP备18000625号-1
爱生活爱技术

湘公网安备 43011102001008号