接口指针的疑惑

来源: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,这样是可以的。但是没啥用。

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程