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. Class加载顺序

    原文:https://blog.saymagic.cn/2017/07/01/class-common-question.html 类的初始化顺序是怎样的? 我们尝试从class文件中找到答案.来看这 ...

  2. 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)

    议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...

  3. 零基础入门学习Python(15)--格式化

    前言 上节课我们介绍了字符串N多种奇葩方法的用法,但是我们唯独漏掉了format方法,那为何不把format方法和上节课的内容一起讲呢? 因为小甲鱼觉得format方法,跟今天的主题是如出一辙的,都是 ...

  4. python爬虫入门02:教你通过 Fiddler 进行手机抓包

    哟~哟~哟~ hi起来 everybody 今天要说说怎么在我们的手机抓包 通过 python爬虫入门01:教你在Chrome浏览器轻松抓包 我们知道了 HTTP 的请求方式 以及在 Chrome 中 ...

  5. C++解决大数组问题

    今天写一个C++小程序,竟然出现:"VS 未经处理的异常: 0xC00000FD: Stack overflow" 查了一下,普通数组变量是在堆栈中保存的,而堆栈空间有限,故出此错 ...

  6. 【01】什么是AJAX

    什么是AJAX   AJAX(异步 JavaScript 和 XML)是 synchronous(英[ˈsɪŋkrənəs]) JavaScript and XML 的简称. AJAX不是一门新的编程 ...

  7. 2018/2/16 解析Logback的AppenderBase源码,并举一反三的实现Logback扩展功能的思路,以及它的实际业务应用场景

    在学习Logback的过程中,知道了它有一个可以将日志往第三方数据源写的功能,这个功能的实现就是这个AppenderBase类,不禁想看看它的源码. 下面是AppenderBase类的所有子类(也就是 ...

  8. SOJ 2930_积木城堡

    [题意]若干个城堡,给定每个城堡的积木数及每块积木的棱长.从城堡中抽出积木使每块城堡高度相同,求最大高度 [分析]城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装 ...

  9. Google Protocol Buffer 的使用(一)

    一.什么是Google Protocol Buffer下面是官网给的解释:Protocol buffers are a language-neutral, platform-neutral exten ...

  10. Servlet的客户端请求

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/client-request.html: 当浏览器请求网页时,它会向Web服务器发送大量信息,这些 ...