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. 총화
본 고 는 맵 을 바탕 으로 사전 데이터 유형 을 실 현 했 고 범 형 방식 을 사용 하여 병발 안전 을 지원 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Golang 구현 대기열 및 스택대기열: 스택: github 주소:https://github.com/golibec/Lstruct.git 후속적으로 각종 데이터 구조와 주류 알고리즘을 지속적으로 보완할 것이다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.