type sequenceIDGenerator struct { idMgrClient IDManagerClient // client for getting IDPrefix preGenerateIDs chan string // pre-generated ids } // Pre-generate id and send to channel. // This method should be called once and only once when init generator func (g *sequenceIDGenerator) preGenIDs() { var idBase, id string var seq uint64 for { if idBase == "" || seq == 0 { // first call or over max uint 64 idBase = g.idMgrClient.GetNewIDPrefix("ServiceA") } id = fmt.Sprintf("%s-%d", idBase, strconv.FormatUint(seq, 32)) g.preGenerateIDs <- id seq++ } } // NewSequenceIDGenerator returns new id generator func NewSequenceIDGenerator(imc IDManagerClient) *sequenceIDGenerator { g := &sequenceIDGenerator{ idMgrClient: imc, preGenerateIDs: make(chan string, 10000), } go g.preGenIDs() return g } // NextID returns next id. func (g *sequenceIDGenerator) NextID() string { return <-g.preGenerateIDs }