golang重用struct的方法

时间:2014-04-01 01:02:53

标签: go

我正在学习go并且正在查看一个简单的示例Web应用程序: https://github.com/campoy/todo/blob/master/task/task.go

有结构:


    type Task struct {
        ID    int64  // Unique identifier
        Title string // Description
        Done  bool   // Is this task done?
    } 


    // TaskManager manages a list of tasks in memory.
    type TaskManager struct {
        tasks  []*Task
        lastID int64
    }

TaskManager上有方法     func(m * TaskManager)保存(任务*任务)错误...     func(m * TaskManager)All()[] * Task ...

我想知道如何将TaskManager概括为Manager,因此它将具有这些相同的方法(即:save,all,find),因此它可以用于不同的结构,例如Users,它们都具有ID字段。< / p>

我假设构建一般类型的数组并不合适,因为在&#39; save&#39;中有一个ID。和&#39;找到&#39;方法

2 个答案:

答案 0 :(得分:3)

Go没有泛型(至少现在),但你仍然可以通过使用界面执行你想要的(不是100%)。

type Manager interface {
  Save(interface{}) error
  All() ([]interface{}, error)
}

当然,它并非免费提供,您需要在TaskManager中执行一些错误处理来实现界面,例如:

func (m *TaskManager) Save(t interface) error {
  task, ok := t.(Task) // type assertion
  if !ok {
    // return error invalid input type
  }
  // do the rest as normal...
}

:评论示例

type Entry interface {
  SetID(int64)
  GetID()int64
}

type Task struct {...}

func (t *Task) SetID(id int64) {...}
func (t *Task) GetID() {...}

func (m *TaskManager) Save(e Entry) error {...}

有关接口的更多信息: * http://golang.org/ref/spec#Interface_types
* http://golang.org/doc/effective_go.html#interfaces_and_types
* http://golangtutorials.blogspot.com/2011/06/interfaces-in-go.html

答案 1 :(得分:0)

您可能希望为具有ID的结构编写interface,然后概括您的Manager以操作该接口的元素而不是特定结构的元素。