Golang Go语言中问题请教,一个函数返回值为接口类型却返回结构体,这是为什么?

Golang Go语言中问题请教,一个函数返回值为接口类型却返回结构体,这是为什么?

如题,NewHTTP()函数返回值是一个接口,但是 return 的是一个结构体,凭什么啊?为什么这么做啊?返回值改成*HTTP 有什么区别嘛?求教

type HTTP struct {
	outPool   utils.OutPool
	cfg       HTTPArgs
	checker   utils.Checker
	basicAuth utils.BasicAuth
}

func NewHTTP() Service {
	return &HTTP{
		outPool:   utils.OutPool{},
		cfg:       HTTPArgs{},
		checker:   utils.Checker{},
		basicAuth: utils.BasicAuth{},
	}
}

type Service interface {
	Start(args interface{}) (err error)
	Clean()
}

更多关于Golang Go语言中问题请教,一个函数返回值为接口类型却返回结构体,这是为什么?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

20 回复

这是很基础的东西吧

更多关于Golang Go语言中问题请教,一个函数返回值为接口类型却返回结构体,这是为什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


建议先了解 golang 的 duck type
只要这个 strcut 类型实现了 interface 约束的函数,那么他就可以作为这个 interface 类型返回

面向对象基础知识了,不仅 go 其他语言也是类似的

我可不可以认为这是一种约定?

这不是一种约定,而是一种抽象。而当你第一次需要并实现了这种抽象,你就真正地理解了面向接口编程。

lz 可以先学学 go 的 interface 的基础

然后 lz 的写法有一点问题,go 推荐 accept interfaces, return structs 。所以别返回接口

interface 类型的变量能保存实现了这个 interface 的结构体实例

知识到用时,方觉读书少


谢谢大佬们指点,大概明白了 确实基础不牢固

扎心了


新手理解下 哈哈

是不是代码不全啊?我看半天也没看出来 HTTP 结构体哪里实现了 Service 接口😭

是的。我只复制了一部分,但想来我的意思表达明白了

结构实现了接口

说明 http 实现了这个接口,他是想链式操作吧

type HTTP struct {} 肯定在其他的地方实现了 type Service interface {}

因为 HTTP 这个结构体实现了 Start()方法和 Clean()方法,那么其就可以视为一个 Service 接口。

只要实现了这个接口的类,都可以返回啊。这个就是面向对象里的多态。

其实建议写成这样
func NewHTTP() *HTTP {
return &HTTP{
outPool: utils.OutPool{},
cfg: HTTPArgs{},
checker: utils.Checker{},
basicAuth: utils.BasicAuth{},
}
}

在Go语言中,一个函数声明其返回值为接口类型,但实际返回结构体是完全可以的,这是多态性的一种体现,也是Go语言灵活性的一个方面。让我们具体解释一下原因:

  1. 接口是类型的抽象:接口在Go中是一种抽象类型,它规定了对象的行为(即方法集)。只要一个结构体实现了接口中声明的所有方法,那么这个结构体就隐式地实现了该接口。

  2. 接口可以持有实现它的任何值:当你声明一个函数返回接口类型时,这个函数实际上可以返回任何实现了该接口的类型实例。这允许函数返回多种不同类型的值,只要这些值都实现了相同的接口。

  3. 灵活性和可扩展性:这种设计允许代码更加灵活和可扩展。例如,你可以轻松地替换函数返回的具体实现,而不会影响到调用该函数的代码,只要新的实现也满足了接口的要求。

因此,如果一个函数声明其返回值为接口类型,但实际返回了一个结构体实例,这意味着这个结构体已经实现了该接口。这是Go语言鼓励的一种编程模式,它有助于编写更加模块化和可维护的代码。

总结来说,这种做法是利用了Go语言的接口机制来实现多态性和灵活性。在实际编程中,这是非常常见和有用的一个特性。

回到顶部