main.go

package mainimport ("fmt""retriever/mock""retriever/real""time"
)const url = "http://www.imooc.com"
// 下载接口
type Retriever interface {Get(url string) string
}func download(r Retriever) string {return r.Get(url)
}// 上传接口
type Poster interface {Post(utl string, form map[string]string) string
}func post(poster Poster) {poster.Post(url,map[string]string {"name": "ccmouse","course": "golang",})
}// 可以有多个小接口组合
type RetrieverPoster interface {RetrieverPoster
}
func session(s RetrieverPoster) string {s.Post(url, map[string]string {"contents": "another faked imooc.com",})return s.Get(url)
}func main() {var r Retriever// mock/mockretriever.go// mock.Retriever现在是RetrieverPoster接口fmt.Println("-----------测试mock.Retriever接口----------------")r = &mock.Retriever{Contents:"this is a fake imooc.com"}inspect(r)// fmt.Println(download(r))//Type assertionmockRetriever := r.(*mock.Retriever)fmt.Println("Type assertion: "+mockRetriever.Contents)fmt.Println("\n------------测试real.RealRetriever接口---------------")// real/retriever.gor = &real.RealRetriever{UserAgent: "Mozilla/5.0",TimeOut: time.Minute,}inspect(r)// fmt.Println(download(r))//Type assertionrealRetriever := r.(*real.RealRetriever)fmt.Println("Type assertion: "+realRetriever.UserAgent)//  判断接口的类型if mockRetriever,ok := r.(*mock.Retriever); ok {fmt.Println("Type assertion: "+mockRetriever.Contents)} else {fmt.Println("not mock a retriever")}fmt.Println("\n----------测试RetrieverPoster接口-----------------")fmt.Println(session(mockRetriever))
}// 如何判断接口的类型
func inspect(r Retriever) {// %T查看类型 %v查看数值fmt.Printf(">类型:%T 数值:%v\n", r, r)fmt.Printf(">Type switch:")switch v := r.(type) {case *mock.Retriever:fmt.Println("Contents: "+v.Contents)case *real.RealRetriever:fmt.Println("UserAgent: "+v.UserAgent)}//mock.Retriever {this is a fake imooc.com}//Contents: this is a fake imooc.com//*real.RealRetriever &{Mozilla/5.0 1m0s}//UserAgent: Mozilla/5.0
}

mock/mockretriever.go

package mockimport ("fmt"
)// mock.Retriever现在是RetrieverPoster接口
type Retriever struct {Contents string
}// 系统接口
// fmt.Printf("%v", )
func (r *Retriever) String() string {return fmt.Sprintf("Retriever: {Contents=%s}", r.Contents)
}//func (r *Retriever)Get(url string) string {
func (r Retriever)Get(url string) string {return r.Contents
}// 这里需要是r *Retriever,否则原对象的r.Contents数值不会改变
func (r *Retriever)Post(url string,form map[string]string) string {r.Contents = form["contents"]return "ok"
}

real/retriever.go

package realimport ("time""net/http""net/http/httputil"
)type RealRetriever struct {UserAgent stringTimeOut time.Duration
}func (r *RealRetriever) Get(url string) string {resp, err := http.Get(url)if err != nil {panic(err)}result, err := httputil.DumpResponse(resp, true)resp.Body.Close()if err != nil {panic(err)}return string(result)
}

5-5 常用系统接口相关推荐

  1. java实验系统常用类,Java的常用系统类

    Java的常用系统类Tag内容描述: 1.Java语言与JBuilder应用初步 第六章 常用的Java系统类,本章要点,字符串类 数值(Number)类及其子类 数组类 集合类 Object类,字符 ...

  2. 系统接口502异常_基于SpringBoot2.0的后台权限管理系统

    简介 基于SpringBoot2.0的后台权限管理系统界面简洁美观敏捷开发系统架构.核心技术采用Spring.MyBatis.Shiro没有任何其它重度依赖. 互联网云快速开发框架,微服务分布式代码生 ...

  3. itpt_TCPL 第五章:指针和数组 - 第八章:UNIX系统接口

    2016.10.11 - 01.09 个人英文阅读练习笔记(极低水准). 10.11 第五章:指针和数组 指针是保存一个变量的地址的变量.指针在C中被大量使用,部分是因为有时候它是唯一表达计算的方法, ...

  4. 【javaWeb微服务架构项目——乐优商城day15】——会调用订单系统接口,实现订单结算功能,实现微信支付功能

    0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 源码笔记及资料: 链接:https://pan.baidu.com/s/1_opfL63P1pzH3rzLnbFiNw 提取码:v ...

  5. 商城-下单-订单系统接口

    商城-下单-订单系统接口 1.订单系统接口 1.1.导入订单服务 1.2.Swagger-UI 1.2.1.什么是OpenAPI 1.2.2.什么是swagger? 1.2.3.快速入门 1)引入依赖 ...

  6. 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础

    本文为我负责编写的电子工业出版社出版的<嵌入式系统原理与接口技术>一书第七章部分,这里整理的仍然是修改稿,供需要的同学参考,本书为普通高等教育"十二五"规划教材,电子信 ...

  7. PHP常用系统函数帅哥特供版

    [TOC] PHP常用系统函数帅哥特供版 常用操作 定界符 <<<EOF内容EOF; 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西: 2.在PHP定界符 ...

  8. Zabbix系统接口文档

                                        Zabbix系统接口文档 (V1.0) 2018.3 注:已上传word版,如需下载请前往https://download.cs ...

  9. Hardware ---常用的接口和通信协议SPI

    最近的项目使用SPI总线进行 SDRAM读写,这里总结下常用的接口和通信协议UART,SPI,I2C SPI SPI(Serial Peripheral Interface,串行外围设备接口),是Mo ...

最新文章

  1. pmp项目变更的流程图_?跟我学PMP | 项目的变更管理应该怎么做?
  2. 因修改/etc/sudoers权限导致sudo和su不能使用的解决方法
  3. 工业互联网 — TSN — 技术架构
  4. PHP定时备份MySQL,mysqldump语法大全
  5. ORACLE导入导出后发生中文乱码的原因及解决办法
  6. centos7 nat模式配置静态ip_Manjaro 配置静态网络IP
  7. 6678EVM调试K1_STK_v1.1例程中GE_test的时候报错:DDR3 leveling has failed, STATUS = 0x40000064的解决办法
  8. oracle 创建模式语句,ORACLE基本使用SQL语句以及归档模式的操作
  9. Advanced Installer 历史版本下载
  10. qt android 悬浮窗,Qt悬浮窗实现
  11. C++两个类互相引用,如何处理最好
  12. Unknown run configuration type AndroidRunConfigurationType的解决办法
  13. vue综合项目——悦听音乐播放器
  14. oracle lob函数,Oracle可以处理LOB字段的常用字符函数
  15. 自考2018版《管理经济学》第一章导论——思维导图
  16. 使用C/C++的#include命令(文件包含命令)时,文件名用尖括号或双撇号(双引号)括起来的区别
  17. numpy 轴与维度的理解
  18. Azure Machine Learning Studio 实例 -- 预测xx年的食物工厂总数
  19. 【python学习笔记】自动抓取雅虎新闻的内容
  20. RT3070无线网卡AP模式

热门文章

  1. [译] JavaScript 的函数式编程是一种反模式
  2. 使用TopShelf做windows服务安装 ---安装参数解释
  3. 【mysql】全文索引match多列报错
  4. java大神养成计划
  5. linux下将编译错误输出到一个文本文件
  6. 前后端分离 与 不分离
  7. Confluence 6 通过 SSL 或 HTTPS 运行 - 创建或请求一个 SSL 证书
  8. Redis:ERR operation not permitted
  9. Linux命令行下载文件百度云盘
  10. 【转】linux shell 逻辑运算符、逻辑表达式