博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
interface
阅读量:7220 次
发布时间:2019-06-29

本文共 3378 字,大约阅读时间需要 11 分钟。

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 mainimport (    "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 mainimport (    "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}

 

 

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/8080170.html,如需转载请自行联系原作者

你可能感兴趣的文章
从零开始学Java(二)基础概念——什么是"面向对象编程"?
查看>>
近期面试总结(2016.10)
查看>>
CodeForces 525D Arthur and Walls :只包含点和星的矩阵,需要将部分星变成点使满足点组成矩形 : dfs+思维...
查看>>
积累_前辈的推荐
查看>>
strcpy和memcpy的区别《转载》
查看>>
在windows平台下electron-builder实现前端程序的打包与自动更新
查看>>
DroidPilot V2.1 手写功能特别版
查看>>
COOKIE欺骗
查看>>
js 强转规范解读
查看>>
ACdream - 1735:输油管道
查看>>
golang 获取get参数
查看>>
服务器状态码
查看>>
非小型电子商务系统设计经验分享
查看>>
Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用
查看>>
深度学习理论解释基础
查看>>
遗传算法
查看>>
将web网站移动化
查看>>
Application-Session-Cookie
查看>>
Perl的多进程框架(watcher-worker)
查看>>
phpMyAdmin 后台拿webshell
查看>>