Serial ID 생성기 - 두번째 글
By SeukWon Kang
이전에 go 언어용 serial id generator 에 대한 글을 올린적이 있었는데. http://kasw.blogspot.kr/2015/01/go-serial-id.html
그 내용의 개량판에 대한 이야기입니다.
업데이트된 코드는 https://github.com/kasworld/idgen 에 있습니다.
작업하다 보니 ID를 꼭 0부터 시작하는 것이 아니고 이전에 기록해둔 부분 부터 시작해야 하는 경우가 생기더군요. ( 서버가 종료 되었다 다시 시작할때 ID를 사용하는 object들의 persistent 가 보장 되어야 하는경우. )
그래서 기존의 idgen 을 수정/업데이트 했습니다.
주 변경점은 여러 생성기를 만들수있도록 factory 함수를 만들고 인자로 시작 값을 받도록 했습니다.
그리고 함수 내에서 goroutine과 channel 을 생성, closure만들어 함수를 리턴합니다.
언제나 처럼 코드는 10줄내외로 짧습니다.
아래 예에선 int32를 사용하고 있지만 필요에 따라 type을 바꾸어 사용하면 될듯 합니다. 아니면 go generate 를 사용하도록 프로그램을 만들어도 좋겠군요.
//start
type ID32 int32
func (id ID32) String() string {
return fmt.Sprintf("0x%0X", int32(id))
}
func NewGen32(beginnum ID32) func() <-chan ID32 {
genCh := make(chan ID32)
go func(i ID32) {
for {
i++
genCh <- i
}
}(beginnum)
return func() <-chan ID32 {
return genCh
}
}
var ID32GenCh = NewGen32(0)
//end