go12---interface
package main /*
接口interface 接口是一个或多个方法签名的集合
只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示
声明实现了哪个接口,这称为 Structural Typing
接口只有方法声明,没有实现,没有数据字段
接口可以匿名嵌入其它接口,或嵌入到结构中
将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个
复制品的指针,既无法修改复制品的状态,也无法获取指针
只有当接口存储的类型和对象都为nil时,接口才等于nil
接口调用不会做receiver的自动转换
接口同样支持匿名字段方法
接口也可实现类似OOP中的多态
空接口可以作为任何类型数据的容器 */ import (
"fmt"
) type empty interface{} //任何结构都实现了空接口, type ReadWrite interface {
readwrite()
} type USB interface {
Name() string //name方法返回usb的名称
Connect() //连接的方法
ReadWrite //接口的嵌入
} type PhoneConect struct {
name string
} //PhoneConect实现USB接口
//go语言没有显示说明实现了哪个接口,只要实现了接口中的方法就表示实现了接口
func (pc PhoneConect) Name() string { //为接口添加方法,就是实现了接口USB
return pc.name
} func (pc PhoneConect) Connect() { //为接口添加方法,就是实现了接口USB
fmt.Println("connect..", pc.name)
} func (pc PhoneConect) readwrite() { //为接口添加方法,就是实现了接口USB,(每个方法都要实现)
fmt.Println("readwrite...")
} func main() {
var a USB //a是一个USB接口类型
a = PhoneConect{name: "PhoneConnect"} //PhoneConect实现了USB接口中的方法,就可以赋值给USB,子类可以给父类赋值,
//a.name = "PhoneConnect"不能这写
a.Connect()
Disconnect(a) //Disconnect.. a1 := PhoneConect{name: "PhoneConnect1"}
Disconnect(a1) //Disconnect..
} func Disconnect(usb USB) {
if pcc, ok := usb.(PhoneConect); ok { //判断是不是PhoneConect,是的话ok=true,
fmt.Println("pcc=", pcc) //pcc= {PhoneConnect}
fmt.Println("ok", ok) //ok true
fmt.Println("是usb", pcc.name) //是usb PhoneConnect
}
fmt.Println("Disconnect..")
} func Disconnect1(usb interface{}) { //参数是空接口,表示可以接收任何类型,
switch v := usb.(type) { //类型判断
case PhoneConect:
fmt.Println("disconnect..", v.name)
default:
fmt.Println("unknow")
}
}
package main import (
"fmt"
) type Connecter interface {
Connect()
} type USB interface {
Name() string
Connecter
} type PhoneConect struct {
name string
} //PhoneConect实现USM接口
func (pc PhoneConect) Name() string {
return pc.name
} func (pc PhoneConect) Connect() {
fmt.Println("connect..", pc.name)
} func main() {
a1 := PhoneConect{name: "PhoneConnect1"}
var a2 USB
var a3 Connecter
a2 = USB(a1) //子类强制转换为父类
a3 = Connecter(a1) //子类强制转换为父类,只能调用父类的方法,不恩调用子类的方法 a2.Connect() //connect.. PhoneConnect1
fmt.Println(a2.Name()) //PhoneConnect1
a3.Connect() //connect.. PhoneConnect1
//a3.Name()没有这个方法了,只能调用父类的方法,不恩调用子类的方法(java也是,需要强制转化为子类对象)
}
package main import (
"fmt"
) type Connecter interface {
Connect()
} type USB interface {
Name() string
Connecter
} type PhoneConect struct {
name string
} //PhoneConect实现USM接口
func (pc PhoneConect) Name() string {
return pc.name
} func (pc PhoneConect) Connect() {
fmt.Println("connect..", pc.name)
} func main1() {
a1 := PhoneConect{name: "PhoneConnect1"} //子类
var a3 Connecter //父类
a3 = Connecter(a1) //子类强制转换成父类 a3.Connect() //父类对象也只能调用父类有的方法,connect.. PhoneConnect1
a1.name = "PhoneConnect2" //子类的属性改了
a3.Connect() //connect.. PhoneConnect1,父类并没有改,说明子类给接口赋值拿到的是一个拷贝
//因此,将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个
//复制品的指针,既无法修改复制品的状态,也无法获取指针 } func main() {
var a1 interface{} //空接口是一个类型,不能写成var a1 := interface{}
fmt.Println(a1 == nil) //true var p *int = nil //p是指向int型的指针
a1 = p
fmt.Println(a1 == nil) //false
}

go12---interface的更多相关文章
- angular2系列教程(七)Injectable、Promise、Interface、使用服务
今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...
- 接口--interface
“interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...
- Configure a bridge interface over a VLAN tagged bonded interface
SOLUTION VERIFIED February 5 2014 KB340153 Environment Red Hat Enterprise Linux 6 (All Versions) Red ...
- Create a bridge using a tagged vlan (8021.q) interface
SOLUTION VERIFIED April 27 2013 KB26727 Environment Red Hat Enterprise Linux 5 Red Hat Enterprise Li ...
- Configure a bridged network interface for KVM using RHEL 5.4 or later?
environment Red Hat Enterprise Linux 5.4 or later Red Hat Enterprise Linux 6.0 or later KVM virtual ...
- Set up VLAN (802.1q) tagging on a network interface?
SOLUTION VERIFIED October 13 2015 KB39674 KB741413 environment Red Hat Enterprise Linux 4 Red Hat En ...
- 谨慎使用Marker Interface
之所以写这篇文章,源自于组内的一些技术讨论.实际上,Effective Java的Item 37已经详细地讨论了Marker Interface.但是从整个Item的角度来看,其对于Marker In ...
- 浅析Go语言的Interface机制
前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...
- 如何设计一门语言(七)——闭包、lambda和interface
人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...
- abstract与interface之房祖名张默版
最近把java基础知识拿出来看看,看到abstract与interface的时候,觉得有点模糊,好像面试官也喜欢问这个问题.我在百度了查了好长时间,觉得讲算比较清楚的是那篇讲 Door,然后想要带个报 ...
随机推荐
- HTML location 用法(获取当前URL)
Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问. 属性 loc ...
- xphrof性能分析线上部署实践
说明 将xhprof部署在线上环境,在特定情况下进行性能分析,方便快捷的排查线上性能问题. 通过参数指定及添加代码行触发进入性能分析,并将结果保存入MongoDB. 因为xhprof对性能的影响,只部 ...
- 九度oj 题目1190:大整数排序
题目1190:大整数排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4142 解决:1867 题目描述: 对N个长度最长可达到1000的数进行排序. 输入: 输入第一行为一个整数N,( ...
- Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框
Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...
- 状态压缩DP总结
POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...
- noip模拟赛 数颜色
分析:高级数据结构学傻了.....一眼看上去觉得是莫队,发现带修改,于是分块,由于写的常数很大,只有70分. 正解很简单,记录下颜色为c的每只兔子的位置,每次二分找这个区间有多少只这种颜色的兔子就可以 ...
- android源码mm时的编译错误no ruler to make target `out/target/common/obj/JAVA_LIBRARIES/xxxx/javalib.jar', needed by `out/target/common/obj/APPS/xxxx_intermediates/classes-full-debug.jar'. Stop.
瞧见没有,就因为多了这一个反斜杠,浪费了一下午时间找问题,哭了~~~~
- TYVJ1716 上帝造题的七分钟
时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 裸体就意味着身体. 描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵.第二分钟,L说, ...
- 在 Windows 10 64 下安装 Memcached,安装 PHP 7.0.22 的 Memcache 扩展
1.之前写过一篇在 PHP 5.6.27 下的博客:http://www.shuijingwanwq.com/2017/09/11/1892/ ,此次是 PHP 7.0.22 下的,如图1 图1 2. ...
- 类(Class)
类 · 目的 面向对象的最主要目的是提高程序的重复使用性. · 包括 属性(attribute).方法(method) · 示例 class Bird(object): have_feather = ...