| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package main
- import "sync"
- type URLStore struct {
- urls map[string]string
- mu sync.RWMutex
- }
- func NewURLStore() *URLStore {
- return &URLStore{urls: make(map[string]string)}
- }
- func (s *URLStore) Get(key string) string {
- s.mu.RLock()
- defer s.mu.RUnlock()
- return s.urls[key]
- }
- func (s *URLStore) Set(key, url string) bool {
- s.mu.Lock()
- defer s.mu.Unlock()
- if _, present := s.urls[key]; present {
- return false
- }
- s.urls[key] = url
- return true
- }
- func (s *URLStore) Count() int {
- s.mu.RLock()
- defer s.mu.RUnlock()
- return len(s.urls)
- }
- func (s *URLStore) Put(url string) string {
- for {
- key := genKey(s.Count()) // generate the short URL
- if ok := s.Set(key, url); ok {
- return key
- }
- }
- // shouldn't get here
- return ""
- }
|