型を満たすことが保証されていない場合
例えば以下のような実装があるとします。
main.go
package main
func main() {}
tasks.go
package main
type Tasks interface {
Create(task string)
Get(id int)
Update(id int, task string)
Delete(id int)
}
ここで定義した Tasks
interface を Update(id int, task string)
メソッドを除いて満たすように実装します。
tasks_impl.go
package main
type TasksImpl struct{}
func (t TasksImpl) Create(task string) {
//TODO implement me
panic("implement me")
}
func (t TasksImpl) Get(id int) {
//TODO implement me
panic("implement me")
}
func (t TasksImpl) Delete(id int) {
//TODO implement me
panic("implement me")
}
この状態でビルドしても特にエラーにはなりません。
型が interface を満たすことを保証するには
では、Update(id int, task string)
メソッドの実装を強制するにはどうしたら良いでしょうか。
How can I guarantee my type satisfies an interface? を参考に var _ Tasks = (*TasksImpl)(nil)
というコードを追加します。
tasks_impl.go
package main
type TasksImpl struct{}
func (t TasksImpl) Create(task string) {
//TODO implement me
panic("implement me")
}
func (t TasksImpl) Get(id int) {
//TODO implement me
panic("implement me")
}
func (t TasksImpl) Delete(id int) {
//TODO implement me
panic("implement me")
}
var _ Tasks = (*TasksImpl)(nil)
この状態でビルドすると Update メソッドを実装できていないというエラーになり、Tasks
interface を満たすことを強制できます。
go build
# go_study
./tasks_impl.go:20:15: cannot use (*TasksImpl)(nil) (value of type *TasksImpl) as Tasks value in variable declaration: *TasksImpl does not implement Tasks (missing method Update)