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的更多相关文章

  1. angular2系列教程(七)Injectable、Promise、Interface、使用服务

    今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...

  2. 接口--interface

    “interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 谨慎使用Marker Interface

    之所以写这篇文章,源自于组内的一些技术讨论.实际上,Effective Java的Item 37已经详细地讨论了Marker Interface.但是从整个Item的角度来看,其对于Marker In ...

  8. 浅析Go语言的Interface机制

    前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...

  9. 如何设计一门语言(七)——闭包、lambda和interface

    人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...

  10. abstract与interface之房祖名张默版

    最近把java基础知识拿出来看看,看到abstract与interface的时候,觉得有点模糊,好像面试官也喜欢问这个问题.我在百度了查了好长时间,觉得讲算比较清楚的是那篇讲 Door,然后想要带个报 ...

随机推荐

  1. Bootstrap table的基础用法

    一.官方文档 Bootstrap 中文网:http://www.bootcss.com/ Bootstrap Table 中文网 : http://bootstrap-table.wenzhixin. ...

  2. MySQL-----增

    增 **创建用户** create user 'alex'@'192.168.1.1' identified by '123123'; create user 'alex'@'192.168.1.%' ...

  3. Python之目录结构

    Python之目录结构 项目名project_name project_name -|--bin (可执行文件) --|--start.py import os,sys #设置环境变量 BASE_DI ...

  4. 使用JS对form的内容验证失败后阻止提交

    1.form的两个事件 submit,提交表单,如果直接调用该函数,则直接提交表单 onSubmit,提交按钮点击时先触发,然后触发submit事件.如果不加控制的话,默认返回true,因此表单总能提 ...

  5. Error connecting to database: No such file or directory

    标签:Error connecting to database: No such file or directory 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...

  6. 网络编程进阶:并发编程之协程、IO模型

    协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发: 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制 ...

  7. 使用Spring-Session共享使用Session

    前言: session共享策略有很多,常见的有粘性复制,高并发下效率查.tomcat-redis-session-manager无疑是一个挺好的方案,缺点要配置tomcat,有点复杂.最优的方案莫过于 ...

  8. HDU 5876 补图 单源 最短路

    ---恢复内容开始--- Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (J ...

  9. UVA 140_Bandwidth

    题意: 定义一个结点的带宽是其距离所有相连结点的最远距离,一个图的带宽是图中所有结点带宽的最小值.给出一个图中各个结点的相邻情况,要求写出一个结点的排列,使得其所构成的图带宽最小. 分析: 枚举全排列 ...

  10. Layui导航、面包屑

    物不在多,有用则精! 学习使用链接 导航:导航一般指页面引导性频道集合,多以菜单的形式呈现,可应用于头部和侧边,是整个网页画龙点晴般的存在.面包屑结构简单,支持自定义分隔符.千万不要忘了加载 elem ...