삽입 순서로 맵 반복
Go 맵은 반복 순서를 보장하지 않으므로 삽입된 순서대로 맵 항목을 검색하기가 어렵습니다. . 이 문제를 해결하려면 다음 접근 방식을 고려하세요.
키 슬라이스 사용
삽입 순서에 따라 키를 추적하기 위해 별도의 슬라이스를 유지합니다. 맵에 키-값 쌍을 추가할 때마다 해당 키가 조각에 존재하는지 확인하세요. 그렇지 않은 경우 추가하십시오. 지도를 반복할 때 키 슬라이스를 사용하여 항목에 액세스합니다.
type Map struct { m map[Key]Value keys []Key } 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]) } }
연결된 목록 값 래퍼 사용
지도 값을 다음과 같은 데이터 구조로 래핑합니다. 삽입 순서에 따라 값과 다음 키에 대한 포인터를 저장합니다. 키-값 쌍을 추가할 때마다 이전 값 래퍼의 다음 포인터를 업데이트하세요. 삽입 순서를 반복하려면 첫 번째 키부터 시작하여 다음 포인터를 따릅니다.
type valueWrapper struct { value Value next *Key } type Map struct { m map[Key]valueWrapper first, last *Key } 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.v, &k} } w := valueWrapper{v: 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.v) k = w.next } }
이러한 솔루션은 지도의 이점을 유지하면서 삽입 순서를 유지해야 하는 필요성을 해결합니다. 맵 작업에서 키 추적을 분리하거나 값을 순서대로 연결하면 원하는 순서로 맵을 안정적으로 반복할 수 있습니다.
위 내용은 삽입 순서에서 Go 맵을 어떻게 반복할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!