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,然后想要带个报 ...
随机推荐
- getQueryString(option)的用法
//页面参数接收1.function getQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...
- linux如何正确设置静态ip
如果是新安装的CentOS7的用户,刚开始应该是没网的,ifconfig命令在CentOS7已经被淘汰了. 1.使用ip addr 即查看分配网卡情况. 2.激活网卡 [root@localhost ...
- python爬虫入门02:教你通过 Fiddler 进行手机抓包
哟~哟~哟~ hi起来 everybody 今天要说说怎么在我们的手机抓包 通过 python爬虫入门01:教你在Chrome浏览器轻松抓包 我们知道了 HTTP 的请求方式 以及在 Chrome 中 ...
- Matlab学习笔记(四)
二.MATLAB基础知识 (六)字符串 字符串的创建和简单操作 用单引号对括起来的一系列字符的组合,每个字符是一个元素,通常通过两个字节来存储 表2-22 字符串常见操作函数(e_two_37. ...
- IP_MULTICAST_LOOP
WINDOWS 中 该选项仅控制接收部分.即设置为0 则控制套接字无法接收自身消息.设置为1 则控制套接字使能接收自身消息. LINUX 中 该先项仅控制发送部分.即设置为0 则控制套 ...
- Win 2003 创建 IP 安全策略来屏蔽端口的图文教程
(本文用示例的方法讲解 IP 安全策略的设置方法,具体的设置还是要根据个人实际的需要来设置.另外 Windows Server 2008 与此类似.千一网络编辑注) IP安全性(Internet Pr ...
- [BZOJ2462] [BeiJing2011]矩阵模板(二维Hash)
传送门 二维哈希即可. 注意质数选的大一些,不然会超时. 还有插入的时候不判重居然比判重要快.. ——代码 #include <cstdio> int main() { ; ") ...
- topcoder SRM 639 div2
见这里 http://ygdtc.sinaapp.com/?p=257
- 【莫比乌斯反演+树状数组+分块求和】GCD Array
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/I [题意] 给定长度为l的一个数组,初始值为0:规定了两种操作: [思路] 找到 ...
- 变量&字符串
变量 变量定义规范: # 声明变量: name = "Neo Zheng" # name为变量名(标识符),"Neo Zheng"是变量值. 变量定义规则: 1 ...