>백엔드 개발 >Golang >Go 맵을 반복할 때 삽입 순서를 유지하는 방법은 무엇입니까?

Go 맵을 반복할 때 삽입 순서를 유지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-20 00:29:09848검색

How to Maintain Insertion Order When Iterating Through a Go Map?

삽입 순서로 맵을 통해 반복

Go의 맵은 반복 순서를 보장하지 않으므로 항목을 검색할 때 실망스러울 수 있습니다. 삽입된 순서대로. 일부 해결 방법이 있지만 별도의 슬라이스를 사용하거나 데이터 중복을 생성하는 경우가 많아 복잡성과 잠재적인 버그가 발생할 수 있습니다.

키 슬라이스를 사용한 솔루션

실행 가능한 한 가지 해결책은 삽입 순서대로 키 조각을 유지하는 것입니다. 맵에 새 쌍을 추가할 때 먼저 키가 슬라이스에 존재하는지 확인하세요. 그렇지 않은 경우 슬라이스에 키를 추가합니다. 반복할 때 슬라이스를 사용하여 순서대로 키를 검색하고 맵에서 해당 값에 액세스하면 됩니다. 슬라이스는 키만 저장하므로 이 접근 방식은 오버헤드가 최소화됩니다.

예:

type Key int
type Value int

type OrderedMap struct {
    m    map[Key]Value
    keys []Key
}

func NewOrderedMap() *OrderedMap {
    return &OrderedMap{m: make(map[Key]Value)}
}

func (om *OrderedMap) Set(k Key, v Value) {
    if _, ok := om.m[k]; !ok {
        om.keys = append(om.keys, k)
    }
    om.m[k] = v
}

func (om *OrderedMap) Range() {
    for _, k := range om.keys {
        fmt.Println(om.m[k])
    }
}

값 래퍼 연결 목록이 있는 솔루션

또는 연결된 목록 구조로 값을 래핑할 수도 있습니다. 각 값 래퍼에는 실제 값과 목록의 다음 키에 대한 포인터가 포함되어 있습니다. 새 쌍을 추가할 때 이전 값 래퍼의 다음 포인터가 새 키를 가리키도록 설정하세요. 반복할 때 첫 번째 키부터 시작하여 다음 포인터를 따라 순서대로 값을 검색합니다.

예:

type Key int
type Value int

type ValueWrapper struct {
    v    Value
    next *Key
}

type OrderedMap struct {
    m           map[Key]ValueWrapper
    first, last *Key
}

func NewOrderedMap() *OrderedMap {
    return &OrderedMap{m: make(map[Key]ValueWrapper)}
}

func (om *OrderedMap) Set(k Key, v Value) {
    if _, ok := om.m[k]; !ok && om.last != nil {
        pw2 := om.m[*om.last]
        om.m[*om.last] = ValueWrapper{pw2.v, &k}
    }
    pw := ValueWrapper{v: v}
    om.m[k] = pw
    if om.first == nil {
        om.first = &k
    }
    om.last = &k
}

func (om *OrderedMap) Range() {
    for k := om.first; k != nil; {
        pw := om.m[*k]
        fmt.Println(pw.v)
        k = pw.next
    }
}

비교

키 슬라이스 접근 방식은 더 간단하지만 슬라이스에서 선형 검색이 필요하므로 요소 제거 효율성이 떨어집니다. 값 래퍼 연결 목록 접근 방식을 사용하면 요소를 빠르게 제거할 수 있으므로 자주 삭제가 예상되는 경우에 더 적합합니다.

궁극적으로 최선의 선택은 애플리케이션의 특정 요구 사항에 따라 달라집니다.

위 내용은 Go 맵을 반복할 때 삽입 순서를 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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