Golang은 여러 개의 Goroutine에서 맵이나 슬라이스 조작을 할 때 주의해야 할 대상입니다.

1051 단어
Golang의 맵과 목록 슬라이드는 모두 인용 형식이고 라인이 안전하지 않기 때문에 여러 개의 go routine에서 읽기와 쓰기를 할 때 "map read and map write"의panic 오류가 발생합니다.
 
어떤 유형의 대상은 다음과 같은 set 방법으로 데이터를 쓰거나 get 방법으로 맵을 되돌려줍니다:
func (this *object) Set(name, val) {
  this.Lock()
  defer this.Unlock()
  
  this.m[name] = val
}

func (this *object) Get() map[string]string {
  this.Lock()
  defer this.Unlock()

  return this.m
}

  
여러 개의 go routine에서 이 대상의 Get () 방법으로 얻은 맵을 읽고 다른 go routine에서 Set () 방법으로 작업을 쓰면 '맵 read and map write' 의 panic 오류가 발생할 수 있습니다.
Get 방법으로 얻은 맵과 Set 방법으로 조작된 맵이 같은 맵이기 때문에 읽기 루트가 같은 시간에 이 두 맵을 조작하면 오류가 발생합니다.
Get 메서드는 다음과 같은 방법으로 맵을 반환하는 것이 좋습니다.
func (this *object) Get() map[string]string {
    this.Lock()
    defer this.Unlock()

    newm := make(map[string]string)
    for k, v := range this.m {
        newm[k] = v
    }

    return newm
}

 
이렇게 하면 매번 Get에서 가져오는 맵은 사실 새로운 맵이기 때문에 동시에 읽고 쓰는 문제를 고려하지 않아도 된다.
전재 대상:https://www.cnblogs.com/yzhch/p/8137128.html

좋은 웹페이지 즐겨찾기