Go 맵의 순차적 반복: 종합 가이드
Go 맵을 순서대로 반복하는 것은 언어의仕様로 인해 어려울 수 있습니다. 순서 보존보다는 동시성을 강조합니다. 이 글에서는 맵 사용의 장점을 유지하면서 순차적인 반복을 달성하기 위한 두 가지 확실한 방법을 살펴보겠습니다.
1. 키 슬라이스로 순서 유지
이 방법에는 반복 순서를 보장하기 위해 별도의 슬라이스에서 맵 키를 추적하는 작업이 포함됩니다. 오버헤드를 도입하는 동시에 이 접근 방식은 단순성과 명확한 구현을 제공합니다.
구현예:
type Key int // Key type type Value int // Value type type Map struct { m map[Key]Value keys []Key } func New() *Map { return &Map{m: make(map[Key]Value)} } func (m *Map) Set(k Key, v Value) { if _, ok := m.m[k]; !ok { m.keys = append(m.keys, k) } m.m[k] = v } func (m *Map) Range() { for _, k := range m.keys { fmt.Println(m.m[k]) } }
2. LinkedList의 값 연결
이 접근 방식에는 실제 값과 다음 키에 대한 참조가 포함된 구조체에 값을 래핑하는 작업이 포함됩니다. 요소를 효율적으로 삽입하고 제거할 수 있습니다.
구현 예:
type Key int // Key type type Value int // Value type type valueWrapper struct { value Value next *Key // Next key } type Map struct { m map[Key]valueWrapper first, last *Key } func New() *Map { return &Map{m: make(map[Key]valueWrapper)} } func (m *Map) Set(k Key, v Value) { if _, ok := m.m[k]; !ok && m.last != nil { w2 := m.m[*m.last] m.m[*m.last] = valueWrapper{w2.value, &k} } w := valueWrapper{value: v} m.m[k] = w if m.first == nil { m.first = &k } m.last = &k } func (m *Map) Range() { for k := m.first; k != nil; { w := m.m[*k] fmt.Println(w.value) k = w.next } }
보너스:
다음은 고려해야 할 몇 가지 추가 팁입니다. :
위 내용은 특정 순서로 Go 맵을 반복하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!