0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go の 型が interface を満たすことを保証する

Posted at

型を満たすことが保証されていない場合

例えば以下のような実装があるとします。

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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?