zoukankan      html  css  js  c++  java
  • go_接口

    duck typeing 

    隐式的实现接口的方法就等于实现了接口

    main函数

    package main
    
    import (
    	"fmt"
    	"learngo/retriever/mock"
    	"learngo/retriever/real"
    )
    
    func main(){
    	var r Retriever
    	r = mock.Retriever{"this is fyf"}
    	r = real.Retriever{}
    	fmt.Println(download(r))
    }
    //interface中的函数不用加func
    type Retriever interface {
    	Get(url string) string
    }
    
    func download(r Retriever) string{
    	return  r.Get("http://www.imooc.com")
    }
    

      实现接口一

    package mock
    
    type Retriever struct {
    	Contents string
    }
    
    //go语言中实现了Get(url string),就被认为实现了Retriever接口
    func (r Retriever) Get(url string) string {
    	return r.Contents
    }
    

      实现接口二(拿下慕课网首页)

    package real
    
    import (
    	"time"
    	"net/http"
    	"net/http/httputil"
    )
    
    type Retriever struct {
    	UserAgent string
    	TimeOut time.Duration
    }
    
    func (r Retriever) 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)
    }
    

    Go语言里面有一个语法,可以直接判断是否是该类型的变量: value, ok= element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。

    如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    type Element interface{}
    type List [] Element
    
    type Person struct {
    	name string
    	age int
    }
    
    //定义了String方法,实现了fmt.Stringer
    func (p Person) String() string {
    	return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)"
    }
    
    func main() {
    	list := make(List, 3)
    	list[0] = 1 // an int
    	list[1] = "Hello" // a string
    	list[2] = Person{"Dennis", 70}
    
    	for index, element := range list {
    		if value, ok := element.(int); ok {
    			fmt.Printf("list[%d] is an int and its value is %d
    ", index, value)
    		} else if value, ok := element.(string); ok {
    			fmt.Printf("list[%d] is a string and its value is %s
    ", index, value)
    		} else if value, ok := element.(Person); ok {
    			fmt.Printf("list[%d] is a Person and its value is %s
    ", index, value)
    		} else {
    			fmt.Println("list[%d] is of a different type", index)
    		}
    	}
    }
    

      

  • 相关阅读:
    sql导数据 自增长
    只能在执行 Render() 的过程中调用 RegisterForEventValidation
    JS获取DropDownList的值
    解决IE6、IE7、IE8、Firefox兼容的两种方案
    C#日期格式化
    页面弹出窗口刷新父页面方式小结
    Dictionary Queue Stack SortedList ArrayList
    asp.net水晶报表推模式加载报表数据代码段
    JS隐藏工具栏菜单栏
    解决在SQL Server 2000的存储过程不能调试
  • 原文地址:https://www.cnblogs.com/luffe/p/8552408.html
Copyright © 2011-2022 走看看