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

12 回复

那么你就不能把它做成接口。

更多关于Golang中如何调用接口里的函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,现在一切都说得通了。抱歉我之前想错了方向。

正如我多次提到的,你需要一个实现了该方法的类型的值。

好的。那么为什么上面的代码会产生错误。你告诉我的代码。我是不是哪里做错了。

抱歉,我没能理解这个问题,您能详细解释一下吗?

谢谢

如果我将 into.Named 作为参数传入,是否需要修改我的 Open 函数定义?

你没有在值上调用该方法,而是将其作为函数调用,因此需要将通常调用该方法的对象作为函数调用的第一个参数提供。

感谢 @NobbZ,我能够解决这个问题了。

在调用 Open 函数之前,我需要为 Named 结构体创建一个对象,通过 init 函数传递,然后使用传递的结构体对象来调用 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的设计,其中接口由其他包(如数据库驱动)实现。

确保你的项目结构正确,并且所有包都在正确的路径下。例如,如果strintoimplement包在同一个模块中,导入路径应该匹配。如果问题仍然存在,检查包名和导入路径是否正确配置。

回到顶部