>백엔드 개발 >Golang >특정 순서로 Go 맵을 반복하려면 어떻게 해야 합니까?

특정 순서로 Go 맵을 반복하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-26 08:15:09712검색

How Can I Iterate Through a Go Map in a Specific Order?

Go 맵의 순차적 반복: 종합 가이드

Go 맵을 순서대로 반복하는 것은 언어의仕様로 인해 어려울 수 있습니다. 순서 보존보다는 동시성을 강조합니다. 이 글에서는 맵 사용의 장점을 유지하면서 순차적인 반복을 달성하기 위한 두 가지 확실한 방법을 살펴보겠습니다.

1. 키 슬라이스로 순서 유지

이 방법에는 반복 순서를 보장하기 위해 별도의 슬라이스에서 맵 키를 추적하는 작업이 포함됩니다. 오버헤드를 도입하는 동시에 이 접근 방식은 단순성과 명확한 구현을 제공합니다.

  • 키 래핑: 맵에 삽입된 각 키에 대해 해당 키가 키 슬라이스에 있는지 확인합니다. 그렇지 않은 경우 키를 슬라이스에 추가합니다.
  • 슬라이스 사용법: 반복 중에 키 슬라이스를 사용하여 맵의 해당 값에 액세스합니다.
  • 동기화 유지: 해당 값이 슬라이스에서 제거되면 슬라이스에서 키를 제거합니다. map.

구현예:

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의 값 연결

이 접근 방식에는 실제 값과 다음 키에 대한 참조가 포함된 구조체에 값을 래핑하는 작업이 포함됩니다. 요소를 효율적으로 삽입하고 제거할 수 있습니다.

  • 값 래퍼: 값과 다음 키에 대한 참조를 사용하여 값 래퍼 구조체를 정의합니다.
  • 맵 삽입: 값 래퍼를 map.
  • 연결 메커니즘: 새 래퍼를 이전 래퍼에 연결하여 삽입 순서를 유지합니다.
  • 반복: 첫 번째 키에서 반복 시작 삽입된 값에 액세스하려면 다음 참조를 따르세요. 주문하세요.

구현 예:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.