我正在学习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;方法
答案 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以操作该接口的元素而不是特定结构的元素。