我有一个结构,我在某个过程中启动,如下所示,这是按预期工作的。
这是特定的跑步者
type TestRunner struct {
path string
name string
}
func NewRunner(p string, n string) *TestRunner {
return &TestRunner{
path: p,
name: n,
}
}
现在我想在同一个包装中创建另一个跑步者,所以我就这样做了。
也是特定的跑步者
type TestRunner2 struct {
path string
name string
}
func NewRunner(p string, n string) *TestRunner2 {
return &TestRunner2{
path: p,
name: n,
}
}
现在我收到func NewRunner
存在的错误
我有另一个文件(在同一个包中),其中包含接口
这是通用实现(同一个包中的不同文件)
type Runner interface {
Run(path string) error
ChangePath(newPath string)
}
所以也许NewRunner应该在那里,建议放置新对象吗?
显然我可以在文件中创建NewRunner1
和NewRunner2
方法,但我不确定是否推荐
答案 0 :(得分:4)
首先,您应该根据他们的功能而不是数字来命名您的跑步者。 FastRunner
和SlowRunner
或LocalRunner
vs RemoteRunner
。你明白了。然后你应该为每一个创建一个构造:
func NewFastRunner( ... ) *FastRunner {
return &FastRunner{ ... }
}
func NewSlowRunner( ... ) *SlowRunner {
return &SlowRunner{ ... }
}
这是一种标准做法,可以生成非常易读,无歧义的代码。
答案 1 :(得分:-1)
您可以为每个跑步者使用方法指针类型接收器,然后实现接口。这样你就不需要返回任何东西,你可以使用指针直接为跑步者分配路径和名称等值。
package main
import (
"fmt"
)
type TestRunner1 struct {
path string
name string
}
type TestRunner2 struct {
path string
name string
}
type Runner interface {
Run(path string) error
ChangePath(newPath string)
}
func (tr1 *TestRunner1) NewRunner(p string, n string) {
tr1.path = p
tr1.path = n
}
func (tr2 *TestRunner2) NewRunner(p string, n string) {
tr2.path = p
tr2.path = n
}
func main() {
fmt.Println("Hello, playground")
}
检查代码here