【发布时间】:2021-10-13 22:09:54
【问题描述】:
我正在尝试重构一些golang源代码,我想使用接口但是我发现了很大的困难(请耐心等待,我是一个铁杆C/C++孤儿)
我提取了一个小样本,显示我得到的错误
package main
import "fmt"
type LogProcessor interface {
Init() int
}
type MyProcessor struct {
a int
}
func (m MyProcessor) Init() int {
return m.a
}
func main() {
t := &(MyProcessor{2})
var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!
fmt.Println((*t).Init(), (*p).Init())
}
为什么第二个作业失败了?
添加修改后的代码以演示我正在尝试做的事情。我认为接口更类似于 C++ 类。我的错。还在学习中
package main
import "fmt"
type LogProcessor interface {
Init() int
}
type MyProcessor struct {
a int
}
func (m *MyProcessor) Init() int {
m.a++
return m.a
}
func main() {
t := &(MyProcessor{2})
m := MyProcessor{4}
var p LogProcessor = &m
fmt.Println(t.Init(), p.Init())
fmt.Println(t.a, m.a)
}
【问题讨论】:
-
Go 中几乎从不使用指向接口的指针,因此
p应该只是LogProcessor。你也不需要(*t).Init(),只需t.Init(),让编译器自动转换为(*t).Init()即可。 -
在这两种语言方面更有经验的人希望能回答您。但是你有这些资源来帮助你转换 github.com/golang/go/wiki/GoForCPPProgrammers 和 talks.golang.org/2012/goforc.slide#1(你编写 Go 代码的方式是铁杆;)
-
@aturetta 是的,但没关系,几乎总是如此。接口指针唯一有意义的情况是,如果您使用间接分配接口变量。除此之外,接口按值传递并不重要。您对按值传递有哪些具体担忧?
-
@aturetta 您将向结构传递一个指针,并确保它使用指针接收器而不是值接收器来实现接口。
-
@aturetta 顺便说一句,如果您必须使用指向接口的指针,则需要分两步进行初始化play.golang.org/p/MAg0N3xD-6F