Golang中如何调用接口里的函数
Golang中如何调用接口里的函数 str文件夹中的calling.go文件
package str
import "str/into"
type DA struct {
aa string
bb into.Con
}
func Ring(a string) *DA {
c := into.Open(a)
d := c.Db()
da := &DA{
aa: d,
bb: c,
}
return da
}
str/into文件夹中的interface.go文件
package into
//Named is an interface with open function
type Named interface {
Open(name string) Con
}
//Con is an interface with db function
type Con interface {
Db() string
}
但在calling.go文件中出现错误,提示into.Open函数未定义。不过其他包会实现这个函数。
就像database/sql/driver/driver.go是如何被其他包定义的那样。
implement.go文件实现了interface.go中的函数
package implement
import (
"str/into"
)
type Con struct {
str1 string
len1 int
}
func Open(a string) into.Con {
d := len(a)
return &Con{str1: a, len1: d}
}
func (c *Con) Db() string {
str2 := "Akhil" + c.str1
return str2
}
谢谢
更多关于Golang中如何调用接口里的函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是的,现在一切都说得通了。抱歉我之前想错了方向。
正如我多次提到的,你需要一个实现了该方法的类型的值。
好的。那么为什么上面的代码会产生错误。你告诉我的代码。我是不是哪里做错了。
抱歉,我没能理解这个问题,您能详细解释一下吗?
谢谢
如果我将 into.Named 作为参数传入,是否需要修改我的 Open 函数定义?
你没有在值上调用该方法,而是将其作为函数调用,因此需要将通常调用该方法的对象作为函数调用的第一个参数提供。
我不确定自己是否理解了您的问题,因此我觉得之前的解释已经是我能给出的最佳说明了。
因此我建议您完成关于接口和方法的教程。
你需要为你的数据类型实现 into.Named.Open(),然后在该类型的值上调用该方法:
package main
import (
"fmt"
)
type Named interface {
Open()
}
type MyType struct {
name string
}
func (m MyType) Open() {
fmt.Printf("Opening %s\n", m.name)
}
func main() {
var named Named = MyType{"example"}
named.Open()
}
PS:看起来你已经为你的 implement.Con 正确实现了这个方法。
type Named struct {
}
func (n *Named) Open(a string) into.Con {
d := len(a)
return &Con{str1: a, len1: d}
}
如果我这样声明,就必须通过 into.Named.Open 来调用 Open 函数,但我希望它能像调用 str.Ring() 那样通过 into.Open 来调用。
可以这样调用吗?
当我这样声明并尝试运行代码时,出现了以下错误:
# str
C:\Go\src\str\calling.go:11:22: 方法表达式 into.Named.Open 的调用参数不足
现有 (string)
需要 (into.Named, string)
在Go语言中,接口类型本身不包含函数实现,因此不能直接调用接口中声明的函数。接口只定义了方法签名,具体实现由其他类型提供。根据你提供的代码,问题在于into.Open函数在into包中仅作为接口Named的方法声明存在,而没有具体的函数实现。
在你的calling.go文件中,你试图调用into.Open(a),但into包中的Open是接口Named的方法,不是包级函数。正确的做法是使用一个实现了Named接口的类型来调用Open方法。从你的implement.go文件来看,implement包提供了Open函数,它返回一个into.Con接口类型。
要解决这个问题,你需要修改calling.go文件,使用implement包中的Open函数,而不是直接调用into.Open。以下是修改后的示例代码:
首先,更新calling.go文件,导入implement包并调用其Open函数:
package str
import (
"str/implement" // 导入实现包
"str/into"
)
type DA struct {
aa string
bb into.Con
}
func Ring(a string) *DA {
c := implement.Open(a) // 使用implement包中的Open函数
d := c.Db()
da := &DA{
aa: d,
bb: c,
}
return da
}
这样,implement.Open(a)返回一个实现了into.Con接口的对象,然后你可以调用Db()方法。这类似于Go标准库中database/sql/driver的设计,其中接口由其他包(如数据库驱动)实现。
确保你的项目结构正确,并且所有包都在正确的路径下。例如,如果str、into和implement包在同一个模块中,导入路径应该匹配。如果问题仍然存在,检查包名和导入路径是否正确配置。


