Go语言接口的概念

该博客介绍了如何在Go语言中通过封装HTTP请求来创建可复用的代码,并利用接口实现测试的灵活性。首先展示了一个简单的HTTP获取网页内容的程序,然后逐步改进,将请求功能抽取到单独的包中。通过定义接口,使得在测试时可以方便地切换到测试用的实现,避免频繁修改代码。这种做法提高了代码的可维护性和测试效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看看一个程序

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函数中的返回改为测试文件内所定义的类型即可。这就避免了麻烦的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值