삽입 순서로 맵을 통해 반복
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!