为不同的结构创建构造函数

时间:2018-02-15 11:39:25

标签: go

我有一个结构,我在某个过程中启动,如下所示,这是按预期工作的。

这是特定的跑步者

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应该在那里,建议放置新对象吗?

显然我可以在文件中创建NewRunner1NewRunner2方法,但我不确定是否推荐

2 个答案:

答案 0 :(得分:4)

首先,您应该根据他们的功能而不是数字来命名您的跑步者。 FastRunnerSlowRunnerLocalRunner 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