英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论