Golang 데이터 구조 - 사전

Golang 데이터 구조 - 사전
사전 저장 [key, value] 네, Go 는 매우 편리 하고 내 장 된 map 형식 을 제공 합 니 다.
본 고 는 내 장 된 map 유형 을 강화 하고 편리 한 조작 을 추가 하여 그 내용 을 얻 거나 바 꾸 는 데 사용 합 니 다.창설 ItemDictionary 범 형, 병발 안전 은 모든 구체 적 인 유형 을 생 성 할 수 있 습 니 다.
1. 목표dict := ValueDictionary{} 사전 을 만 들 고 노출 방법 을 제공 합 니 다.
Set()
Delete()
Has()
Get()
Clear()
Size()
Keys()
Values()

2. 실현
package dict

import (
	"github.com/cheekybits/genny/generic"
	"sync"
)

type Key   generic.Type
type Value generic.Type

type ValueDictionary struct {
	data map[Key]Value
	mux sync.RWMutex
}

func (s *ValueDictionary)Set(key Key, value Value)  {
	if s.data == nil{
		s.data = map[Key]Value{}
	}
	s.mux.Lock()
	defer s.mux.Unlock()
	s.data[key] = value
}

func (s *ValueDictionary)Delete(key Key) bool{
	s.mux.Lock()
	defer s.mux.Unlock()

	_,ok := s.data[key]
	if ok {
		delete(s.data, key)
	}

	return ok
}

func (s *ValueDictionary)Has(key Key) bool{
	s.mux.RLock()
	s.mux.RUnlock()

	_,result := s.data[key]

	return result
}

func (s *ValueDictionary)Get(key Key) Value{
	s.mux.RLock()
	s.mux.RUnlock()

	result,_ := s.data[key]

	return result
}

func (s *ValueDictionary)Clear(){
	s.mux.Lock()
	defer s.mux.Unlock()
	s.data = map[Key]Value{}
}

func (s *ValueDictionary)Size() int{
	return len(s.data)
}

func (s *ValueDictionary)Keys() []Key{
	s.mux.RLock()
	s.mux.RUnlock()

	keys := make([] Key,len(s.data))
	for k := range s.data{
		keys = append(keys, k)
	}

	return keys
}

func (s *ValueDictionary)Values() []Value{
	s.mux.RLock()
	s.mux.RUnlock()

	values := make([] Value,len(s.data))
	for _, v := range s.data{
		values = append(values, v)
	}

	return values
}

3. 테스트
테스트 코드 는 위 에서 정의 한 사전 을 어떻게 사용 하 는 지 설명 합 니 다.저 희 는 바 텀 맵 과 직접 상호작용 을 하지 않 지만 어떻게 Go 가 맵 유형 을 제공 하지 않 았 는 지 다른 실현 이 필요 합 니 다.
package dict

import (
	"fmt"
	"testing"
)

func TestValueDictionary_Set(t *testing.T) {
	dict := ValueDictionary{}
	dict.Set("1",1)
	dict.Set("2",2)
	dict.Set("3",3)
	dict.Set("4",4)

	fmt.Println("size:",dict.Size())
	fmt.Println("1:",dict.Get("1"))

	dict.Delete("1")
	fmt.Println("keys",dict.Keys())
	fmt.Println("values",dict.Values())
	fmt.Println("has 2",dict.Has("2"))
	fmt.Println("del 2",dict.Delete("2"))

	fmt.Println("size:",dict.Size())

	dict.Clear()
	fmt.Println("size:",dict.Size())
}


우 리 는 아래 명령 을 통 해 구체 적 인 유형의 사전 을 생 성 할 수 있다.
genny -in ItemDictionary.go -out dictionary-string-int.go gen "Key=string Value=int"


4. 총화
본 고 는 맵 을 바탕 으로 사전 데이터 유형 을 실 현 했 고 범 형 방식 을 사용 하여 병발 안전 을 지원 한다.

좋은 웹페이지 즐겨찾기