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,然后想要带个报 ...
随机推荐
- CSU 2018年12月月赛 D 2216 : Words Transformation
Description There are n words, you have to turn them into plural form. If a singular noun ends with ...
- 笔试算法题(37):二叉树的层序遍历 & 最长递增的数字串
出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b c d e f g h i 分 ...
- [Python3网络爬虫开发实战] 1.9.4-Scrapyd API的安装
安装好了Scrapyd之后,我们可以直接请求它提供的API来获取当前主机的Scrapy任务运行状况.比如,某台主机的IP为192.168.1.1,则可以直接运行如下命令获取当前主机的所有Scrapy项 ...
- centos6基础优化
一.关闭SELinux功能 selinux功能太严苛,还是关闭了吧 法一:修改配置文件,永久生效 [root@web01 ~]# sed -i 's/SELINUX=enforcing/SELINUX ...
- 基于nvm的Node、NPM的版本管理(NPM permission error的解决)
最近在使用npm过程中,发现全局安装总会遇到permission相关的错误,所以总是要在前面加sudo,还得不停输入密码. 懒惰使我进步,随手google了一下相关问题的解决方案,发现npm在官方文档 ...
- 15Spring AOP基础
为什么需要AOP? 先来看一段代码: package com.cn.spring.aop.helloworld; //加减乘除的接口类 public interface ArithmeticCalcu ...
- 基于vue实现模糊匹配(这里以邮箱模糊匹配为例,其他的模糊匹配都可以类比)
html部分(主要部分): js: data: methods: 效果图:
- 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)
一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...
- JS 根据参数是否为空进行true|false判断呢
<form id="actForm" action="${ctx}/meeting/vip/saveMeetingAttendVipAct" method ...
- 【Codeforces 231C】To Add or Not to Add
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 把数组排个序, 显然优先用大的且小于枚举的数字a[i]的数字变成a[i] 那么肯定有一个范围j. 然后a[j~i-1]都能在k花费以内变成a[ ...