客户端代码:
func GenerateID() (string, error) {
c := connect.Instance() //连接 grpc
cc, cancel := c.ServerClient()
defer cancel()
//生成 id
r, err := cc.GenerateSnowflakeID(c.Ctx, &serv.GenerateSnowflakeRequest{WorkID:"1"})
if err != nil {
return "", err
}
return r.GetMessage(), err
}
func main() {
data := ""
for i:=0;i<=100;i++{
id, err := GenerateID()
str := gconv.String(id)
fmt.Println("ID(运行到第"+gconv.String(i+1)+"条):"+str+",长度:"+gconv.String(len(str)))
if strings.Contains(data,","+str+","){
fmt.Println("ID 重复(运行到第"+gconv.String(i+1)+"条):"+str)
break
}else{
if err != nil{
fmt.Println(err.Error())
}
data = data+","+str+","
}
}
}
生成结果
sunmoondeMacBook-Pro:client_test sunmoon$ go run main.go
ID(运行到第 1 条):1581769199913537536,长度:19
ID(运行到第 2 条):1581769199913537536,长度:19
ID 重复(运行到第 2 条):1581769199913537536
服务端代码
// GenerateSnowflakeID 生成 ID
func (s *Server) GenerateSnowflakeID(ctx context.Context, in *serv.GenerateSnowflakeRequest) (re *serv.GenerateReply, err error) {
gen, err := snowflake.New().SetWorkerID(gconv.Int64(in.GetWorkID())).Init()
if err != nil {
glog.Line(true).Println(err.Error())
return
}
id, err := gen.Generate()
if err != nil {
glog.Line(true).Println(err.Error())
return
}
//id := s.GetWuid()
re = &serv.GenerateReply{Message: gconv.String(id)}
return
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.