接口指针的疑惑
来源:6-6 常用系统接口

正义柔情永在
2019-03-12
老师:百忙之中,跪请解惑啊
//=定义接口=========
package interfaces
type TCPGet interface {
Get(url string) string
}
type TCPPost interface {
Post(url string) string
}
type TCP interface {
TCPGet
TCPPost
}
//=定义实现=========================
package interfaces
type Http struct {
Content string
}
func (http Http) Get(url string) string {
return http.Content+"->this is get request"
}
func (http Http) Post(url string) string {
return http.Content+"->this is post request"
}
//=主程序========
const url =“http://www.baidu.com”
func main() {
var myhttpStruct = interfaces.Http{Content: “接口测试”}
//接口可以指向实现了该接口的结构体的指针,
//这个指针通过解地址就可以拿到这个结构体,
//问题1:老师,go语言中是不是接口变量可以接受实现了这个接口的任意类型的指针?
var http interfaces.TCP = &myhttpStruct
fmt.Printf("%T , %T ,%T\n",myhttpStruct,http,&http)
Myrequest(&http) //获取到这个接口的指针,也就是 这个结构体的指针的指针
var httpx * interfaces.TCP = &(&interfaces.Http{Content: “接口测试”})
//问题2,老师,为什么这种语法就不行呢,原因是什么?
fmt.Printf("%T\n",httpx)
}
func Myrequest(http * interfaces.TCP) {
//http 是接口的指针,通过解一次地址获取到的是结构体的指针,通过结构体的指针调用该结构体下的方法
fmt.Printf("%T , %T\n",http,*http)
fmt.Println((*http).Get(url))
fmt.Println((*http).Post(url))
}
1回答
-
ccmouse
2019-03-18
解答是应该的,抱歉隔了很久。
我们的建议是:不要使用接口的指针。其实你可以比较:
var http TCP = &myhttpStruct
var http2 TCP = myhttpStruct这两行都是可以的。我们的变量类型是一个接口的话,在这种情况下是可以同时接受指针和实例的,但=左边不需要是指针,是个接口类型就行。
但是
func (http *Http) Get
func (http *Http) Post
的话,对应的必须是var http TCP = &myhttpStruct
=====
那么接口的指针,并不能两边都加*和&,不过var httpx *TCP = &http,这样是可以的。但是没啥用。
00
相似问题