Golang은 여러 개의 Goroutine에서 맵이나 슬라이스 조작을 할 때 주의해야 할 대상입니다.
어떤 유형의 대상은 다음과 같은 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.