Tag Interfaces
Golang Tips & Tricks #2 - interfaces
When it comes to interfaces, a good practice is to create an interface where you’ll use it. Creating interfaces in advanced is not recommended in Go. There are two exceptions:
- you’re creating a library which will be used in different projects
- you’ll have more than 1 implementation
In the example below, we have a storage implementation.
type inMemoryStorage struct {
mutex *sync.Mutex
storage map[string]*Value
}
func NewStorage() *inMemoryStorage {
return &inMemoryStorage{
storage: map[string]*Value{},
mutex: &sync.Mutex{},
}
}
func (s inMemoryStorage) Set(ctx context.Context, value *Value) error {
s.mutex.Lock()
s.storage[value.key] = value
s.mutex.Unlock()
return nil
}
func (s inMemoryStorage) Get(ctx context.Context, key string) (*Value, error) {
if val, ok := s.storage[key]; ok {
return val, nil
}
return nil, nil
}
func (s inMemoryStorage) GetAll(ctx context.Context) map[string]*Value {
return s.storage
}
func (s inMemoryStorage) Remove(ctx context.Context, key string) error {
s.mutex.Lock()
delete(s.storage, key)
s.mutex.Unlock()
return nil
}
As you can see, we skipped the interface(s) because they are not needed here.
1