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