Go语言接口的概念

先看看一个程序

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	var url string
	fmt.Scanln(&url)
	res, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	result, err := ioutil.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(result))
}

运行后输入网址,返回html文本
例如输入https://www.taobao.com/
在这里插入图片描述
但一般来讲,main函数中不会有太多的代码,改进后变为这个样子

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

type Request struct{}

func (r Request) Get(url string) string {
	res, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	result, err := ioutil.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	return string(result)
}

func main() {
	var url string
	fmt.Scanln(&url)
	var res Request
	fmt.Println(res.Get(url))
}

要是我们想让请求网页的程序独立开来呢,运用我们之前讲的包和封装的知识,变成这样
项目结构:
在这里插入图片描述
main.go

package main

import (
	"RentACoolCar/second/interfaceProject/getHtml"
	"fmt"
)

func getType() getHtml.Request {
	return getHtml.Request{}
}


func main() {
	var url string
	fmt.Scanln(&url)
	var res getHtml.Request = getType()
	fmt.Println(res.Get(url))
}

getHtml.go

package getHtml

import (
	"io/ioutil"
	"net/http"
)

type Request struct{}

func (r Request) Get(url string) string {
	res, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	result, err := ioutil.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	return string(result)
}

但问题来了,如果这个项目要进行测试,而测试的文件在另外一个包内,怎么办?
一、笨方法
测试文件

//testGet.go
package testGet

type Request struct {}

func (r Request) Get(url string) string  {
	return "Test file"
}

将main.go中原本的类型改为testGet.go中所定义的类型

package main

import (
	"RentACoolCar/second/interfaceProject/testGet"
	"fmt"
)

func getType() testGet.Request {
	return testGet.Request{}
}


func main() {
	var url string
	fmt.Scanln(&url)
	var res = getType()
	fmt.Println(res.Get(url))
}

测试完后,要正常运行的话,又得改回来,这样的操作很麻烦,进过观察我们发现,不管是测试文件还是正常的文件,都有一个Get方法,那么我们为何不定义一个东西,它只要能执行Get方法就行,这就是我们说的接口

package main

import (
	"RentACoolCar/second/interfaceProject/getHtml"
	"fmt"
)

type request interface {
	Get(url string) string
}

func getType() request {
	return getHtml.Request{}
}


func main() {
	var url string
	fmt.Scanln(&url)
	var res = getType()
	fmt.Println(res.Get(url))
}

要测试时,将getType函数中的返回改为测试文件内所定义的类型即可。这就避免了麻烦的操作


版权声明:本文为weixin_52224421原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。