在Go语言中调用一个接受接口作为参数的函数。

huangapple go评论79阅读模式
英文:

Calling a function that takes an interface as a parameter in Go

问题

如何将接口作为函数的参数进行构造?

type blahinterface interface {
    method1()
    method2()
    method3()
}

func blah(i blahinterface) {

}

blah(?) // 这里应该填写什么?

在调用 blah 函数时,你需要传入一个实现了 blahinterface 接口的对象作为参数。你可以创建一个结构体,并实现接口中的方法,然后将该结构体的实例传递给 blah 函数。例如:

type myStruct struct {
    // 结构体的字段
}

func (m myStruct) method1() {
    // 实现 method1 方法的逻辑
}

func (m myStruct) method2() {
    // 实现 method2 方法的逻辑
}

func (m myStruct) method3() {
    // 实现 method3 方法的逻辑
}

func main() {
    obj := myStruct{}
    blah(obj) // 将 myStruct 的实例传递给 blah 函数
}

这样,你就可以将实现了 blahinterface 接口的对象传递给 blah 函数了。

英文:

How do you construct an interface as a parameter to a function?

type blahinterface interface {
    method1()
    method2()
    method3()
}

func blah (i blahinterface) {

}


blah(?)  < what goes in here

答案1

得分: 2

实际上,如果你试图在这里放入任何东西,编译器会准确告诉你缺少什么:

type S struct{}

func main() {
    fmt.Println("Hello, playground")
    s := &S{}
    blah(s)
}

在这个示例上运行 go build 会告诉你:

prog.go:20: cannot use s (type *S) as type blahinterface in argument to blah:
    *S does not implement blahinterface (missing method1 method)
 [process exited with non-zero status]

但是如果有:

func (s *S) method1(){}
func (s *S) method2(){}
func (s *S) method3(){}

这个程序会编译成功

所以即使没有**阅读关于接口的内容**,你也会得到指引并猜测出缺少了什么。

英文:

Actually, if you try to put anything "in here", the compiler will tell you precisely what is missing:

type S struct{}

func main() {
	fmt.Println("Hello, playground")
	s := &S{}
	blah(s)
}

A go build on this example would tell you:

prog.go:20: cannot use s (type *S) as type blahinterface in argument to blah:
    *S does not implement blahinterface (missing method1 method)
 [process exited with non-zero status]

But with:

func (s *S) method1(){}
func (s *S) method2(){}
func (s *S) method3(){}

The program do compile just fine.

So even without reading about interfaces, you are guided and can guess what is missing.

huangapple
  • 本文由 发表于 2014年9月18日 03:05:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/25898421.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定