栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

go interface接口

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go interface接口

文章目录
    • duck typing
      • python
      • c++
      • java
      • go
  • go接口定义和实现:
  • go接口的值类型
    • 接口变量里面有什么
    • 查看接口变量
  • go接口组合
  • 特殊接口

自用留存

duck typing
  • 像鸭子走路,像鸭子叫,长得像鸭子,那么就是鸭子
  • 描述事物的外部行为而非内部结构
  • 和一个人或者事务互动,不管是什么人,什么事务,只要提供指定能力,我们与能力互动
  • 严格说go属于结构化类型系统,类似duck typing
python
def download(retriever):
    return retriever.get("www.baidu.com")
  • 运行时 才知道传入的retriever有没有get
  • 需要注释来说明接口
c++
template 
string download(const R& retriever) {
	return retriever.get("www.baidu.com");
}
  • 编译时才知道传入的retriever有没有get
  • 需要注释来说明接口
java

String download(R r) {
	return r.get("www.baidu.com")
}
  • 传入参数必须实现Retriever接口
  • 不是duck typing
go
type Retiever interface {
	Get(url string) string
}
func download(r Retiever) string {
	return r.Get("www.baidu.com")
}
  • 同时具有python,c++的duck typing的灵活性
  • 又具有java类型的检查
go接口定义和实现:

使用者–>实现者

  • 接口由使用者定义
  • 接口实现是隐式的
  • 只要实现接口里面的方法
package main

import (
	"awesome/mock"
	"awesome/retr"
	"fmt"
)

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 fake baidu"}
	r = retr.Retriever{}
	fmt.Println(download(r))
}
package retr

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

type Retriever struct {
	UserAgent string
	TimeOut   time.Duration
}

func (receiver 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)
	}
package mock

type Retriever struct {
	Contents string
}

func (r Retriever) Get(url string) string {
	return r.Contents
}
go接口的值类型
package main

import (
   "awesome/mock"
   "awesome/retr"
   "fmt"
)

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 fake baidu"}
   fmt.Printf("%T %vn", r, r)
   r = retr.Retriever{}
   fmt.Printf("%T %vn", r, r)
   //fmt.Println(download(r))
}
//mock.Retriever {this is fake baidu}
//retr.Retriever { 0s}  //package retr 中 Retriever struct 第一个值默认是空,time默认是0s


package main

import (
   "awesome/mock"
   "awesome/retr"
   "fmt"
   "time"
)

type Retriever interface {
   Get(url string) string
}

func download(r Retriever) string {
   return r.Get("https://www.baidu.com")
}
func main() {
   r := retr.Retriever{
   	"Google29",   //UserAgent   string
   	time.Hour,   //TimeOut      time.Duration
   }
   fmt.Printf("%T %vn", r, r)
}
//retr.Retriever {Google29 1h0m0s}
package retr
import (
-
)
type Retriever struct {
	UserAgent string
	TimeOut   time.Duration
}
func (receiver *Retriever) Get(url string) string { //指针
...
}
-----------------------------------------------------
package main
import (
...
)
type Retriever interface {
...
}
func download(r Retriever) string {
...
}
func main() {
...
	r = &retr.Retriever{ //获取指针
...
	}
	fmt.Printf("%T %vn", r, r)
	//fmt.Println(download(r))
}
/
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号