Go 구조체에서 멤버를 초기화하는 방법
저는 Golang을 처음 사용하므로 할당이 제정신이 아닙니다.
import "sync"
type SyncMap struct {
lock *sync.RWMutex
hm map[string]string
}
func (m *SyncMap) Put (k, v string) {
m.lock.Lock()
defer m.lock.Unlock()
m.hm[k] = v, true
}
나중에 전화합니다.
sm := new(SyncMap)
sm.Put("Test, "Test")
이 순간 포인터 패닉이 없습니다.
다른 하나의 함수를 사용하고 바로 다음에 호출하여 문제를 해결했습니다 new()
.
func (m *SyncMap) Init() {
m.hm = make(map[string]string)
m.lock = new(sync.RWMutex)
}
하지만이 상용구 초기화를 제거 할 수 있는지 궁금합니다.
생성자 만 있으면됩니다. 일반적으로 사용되는 패턴은 다음과 같습니다.
func NewSyncMap() *SyncMap {
return &SyncMap{hm: make(map[string]string)}
}
구조체 내부에 더 많은 필드가있는 경우 고 루틴을 백엔드로 시작하거나 종료자를 등록하는 경우이 생성자에서 모든 작업을 수행 할 수 있습니다.
func NewSyncMap() *SyncMap {
sm := SyncMap{
hm: make(map[string]string),
foo: "Bar",
}
runtime.SetFinalizer(sm, (*SyncMap).stop)
go sm.backend()
return &sm
}
뮤텍스가 초기화되지 않았기 때문에 'Mue'의 솔루션이 작동하지 않습니다. 다음 수정이 작동합니다.
package main
import "sync"
type SyncMap struct {
lock *sync.RWMutex
hm map[string]string
}
func NewSyncMap() *SyncMap {
return &SyncMap{lock: new(sync.RWMutex), hm: make(map[string]string)}
}
func (m *SyncMap) Put (k, v string) {
m.lock.Lock()
defer m.lock.Unlock()
m.hm[k] = v
}
func main() {
sm := NewSyncMap()
sm.Put("Test", "Test")
}
http://play.golang.org/p/n-jQKWtEy5
Good catch by deamon. Mue was possibly thinking of the more common pattern of including the lock as a value rather than a pointer. Since the zero value of a Mutex is a ready-to-use unlocked Mutex, it requires no initialization and including one as a value is common. As a further simplification, you can embed it by omitting the field name. Your struct then acquires the method set of the Mutex. See this working example, http://play.golang.org/p/faO9six-Qx. Also I took out the use of defer. To some extent it's a matter of preference and coding style, but since it does have a small overhead, I tend not to use it in small functions, especially if there is no conditional code.
ReferenceURL : https://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct
'programing' 카테고리의 다른 글
파이썬에서 HTML 구문 분석-lxml 또는 BeautifulSoup? (0) | 2021.01.15 |
---|---|
뮤텍스는 변경 가능해야합니까? (0) | 2021.01.15 |
힘내는 내가 원점보다 얼마나 많은 커밋인지 보여주지 않는다. (0) | 2021.01.15 |
모바일 Safari 자동 초점 텍스트 필드 (0) | 2021.01.15 |
시간대가없는 PostgreSQL 변경 유형 타임 스탬프-> 시간대 포함 (0) | 2021.01.15 |