5-3 接口的值类型

main.go

package main

import (
    "fmt"
    "retriever/mock"
    "retriever/real"
    "time"
)

type Retriever interface {
    Get(url string) string
}

func download(r Retriever) string {
    return r.Get("http://www.imooc.com")
}

func main() {
    var r Retriever
    // mock/mockretriever.go
    r = mock.Retriever{Contents:"this is a fake imooc.com"}
    inspect(r)
    // fmt.Println(download(r))
    //Type assertion
    mockRetriever := r.(mock.Retriever)
    fmt.Println("Type assertion: "+mockRetriever.Contents)

    fmt.Println("---------------------------")

    // real/retriever.go
    r = &real.RealRetriever{
        UserAgent: "Mozilla/5.0",
        TimeOut: time.Minute,
    }
    inspect(r)
    // fmt.Println(download(r))
    //Type assertion
    realRetriever := 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")
    }
}

// 如何判断接口的类型
func inspect(r Retriever) {
    // %T查看类型 %v查看数值
    fmt.Printf("类型:%T 数值:%v\n", r, r)
    fmt.Println("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 mock

type Retriever struct {
    Contents string
}

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

real/retriever.go

package real

import (
    "time"
    "net/http"
    "net/http/httputil"
)

type RealRetriever struct {
    UserAgent string
    TimeOut 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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值