Learn Go (六) 面向接口

duck typing

许多编程语言都支持 Duck Typing ,通常 Duck Typing 是动态编程语言用来实现多态的一种方式

duck.png

Duck Typing 的原话是,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是一只鸭子。描述事物的外部行为而非内部结构

Demo

  • Python

    def download(retriever):
        return retriever.get("www.imooc.com")
    

    运行时才知道传入的 retriever 有没有 get; 需要注释来说明接口

  • c++

    template <class R>
    string download(const R& retriver) {
        retrun retriever.get("www.imooc.com");
    }
    

    编译时才知道传入的 retriever 有没有 get; 需要注释来说明接口

  • java

    java 是没有 duck typing, 有类似的

    <R extends Retriver>
    String download(R r) {
        return r.get("www.imooc.com")
    }
    

    传入的参数必须实现 Retriever 接口; 不是 duck typing

  • go

    javaduck typing

    type R interface {
    
        Get(url string) string
    }
    

接口

定义

package mock

type Retriever stuct {
    Contents string
}

func (r Retriever) Get(url string) string {
    return r.Contents
}

  • 接口由使用者定义

    // 定义接口
    type Retriever interface {
        Get(url string) string
    }
    
    
    // 使用 
    func download(r Retriever) string {\
        return r.Get("https://www.baidu.com")
    }
    
  • 接口实现是隐式的

    func main() {
        var r Retriever
        // 调用接口
        r = mock.Retriever("this is hello")
    }
    
  • 只要实现接口里的方法

接口的值类型

打印出类型, 和 value

func main() {
        var r Retriever
        // 调用接口
        r = mock.Retriever("this is hello")
        fmt.Printf("%T %v\n", r, r)  // 结果 mock.Retriever {this is hello }
    }

  • 接口变量里有什么

    value.png
    image.png
    • 接口变量自带指针
    • 接口变量同样采用值传递, 几乎不需要使用接口的指针

接口变量

  • 表示任何类型: interface{}
  • Type Assertion
  • Type Switch

接口组合

可以将多个接口组合成一个新的接口, 然后通过组合后的接口, 调用里面每个接口元素的方法

// 接口一
type Retriever interface {
    Get(url string) string
}

// 接口二
type Poster interface {
    Post(url string, form map[string]string) string
}

// 接口组合
type RetrieverPoster interface {
    Retriever
    Poster
}

// 调用
func session(s RetrieverPoster) string {
    s.Post(url, map[string]string{
        "contents" : "hello duck typing"
    })
    
    return s.Get(url)
}

常用系统接口

  • Stringer

    方法被用于打印传递的值, 格式和未格式化的字符串打印

  • Reader

    Reader 实现了 io.Reader、io.ReaderAt、io.ByteReader、io.ByteScanner、
    io.RuneReader、io.RuneScanner、io.Seeker 和 io.WriterTo 通过读取接口
    从一个字符串。
    Reader 的零值的操作类似于空字符串的 Reader。

    func printFileContents(reader io.Reader) {
       scanner := bufio.NewScanner(reader)
    
       for scanner.Scan() {
          fmt.Println(scanner.Text())
       }
    }
    
  • Writer

    Writer 是封装了基本 Write 方法的接口。

    Write 将 len(p) 个字节从 p 写入底层数据流。
    它返回从 p (0 <= n <= len(p)) 写入的字节数
    以及任何导致写入提前停止的错误。
    如果 Write 返回 n < len(p),则它必须返回一个非 nil 错误。
    写入不得修改切片数据,即使是临时修改。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Golang Go语言设计初衷 针对其他语言的痛点进行设计 并加入并发编程 为大数据,微服务,并发而生的通用编程语...
    Susu_8601阅读 231评论 0 0
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,612评论 1 180
  • 欢迎来我的博客 go 语言仅支持封装,不支持继承和多态go 语言没有class 只有struct 结构体 声明和创...
    LL大L阅读 410评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,046评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,877评论 0 2