1、用go编写的随机数据生成器

开源地址:https://github.com/brianvoe/gofakeit

实例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/brianvoe/gofakeit/v6"
  5. )
  6. //主函数 程序的入口
  7. func main() {
  8. fmt.Println(gofakeit.JobTitle())
  9. fmt.Println(gofakeit.Phone())
  10. fmt.Println(gofakeit.CurrencyShort())
  11. }

2、Excel工具包

开源地址:https://gitee.com/xurime/excelize

实例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/360EntSecGroup-Skylar/excelize/v2"
  5. )
  6. func main() {
  7. f := excelize.NewFile()
  8. // 创建一个工作表
  9. index := f.NewSheet("Sheet2")
  10. // 设置单元格的值
  11. f.SetCellValue("Sheet2", "A2", "Hello world.")
  12. f.SetCellValue("Sheet1", "B2", 100)
  13. // 设置工作簿的默认工作表
  14. f.SetActiveSheet(index)
  15. // 根据指定路径保存文件
  16. if err := f.SaveAs("Book1.xlsx"); err != nil {
  17. fmt.Println(err)
  18. }
  19. }

3、一种异步处理能力

开源地址:https://gitee.com/freshcn/async

实例:

  1. // 建议程序开启多核支持
  2. runtime.GOMAXPROCS(runtime.NumCPU())
  3. // 耗时操作1
  4. func request1()interface{}{
  5. //sql request...
  6. }
  7. // 耗时操作2
  8. func request2()interface{}{
  9. //sql request...
  10. }
  11. // 新建一个async对象
  12. async:=new async.New()
  13. // 添加request1异步请求,第一个参数为该异步请求的唯一logo,第二个参数为异步完成后的回调函数,回调参数类型为func()interface{}
  14. async.Add("request1",request1)
  15. // 添加request2异步请求
  16. async.Add("request2",request2)
  17. // 执行
  18. if chans,ok := async.Run();ok{
  19. // 将数据从通道中取回,取回的值是一个map[string]interface{}类型,key为async.Add()时添加的logo,interface{}为该logo回调函数返回的结果
  20. res := <-chans
  21. // 这里最好判断下是否所有的异步请求都已经执行成功
  22. if len(res) == 2 {
  23. for k, v := range res {
  24. //do something
  25. }
  26. } else {
  27. log.Println("async not execution all task")
  28. }
  29. }
  30. // 清除掉本次操作的所以数据,方便后续继续使用async对象
  31. async.Clean()

4、数据转换

开源地址:https://gitee.com/JesusSlim/dtcvt

实例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/jesusslim/dtcvt"
  5. )
  6. func main() {
  7. //to string
  8. a := []byte("sa")
  9. r := dtcvt.MustString(a, "gg")
  10. fmt.Println("To string:", r)
  11. //to int
  12. b := 123
  13. r2 := dtcvt.MustInt(b)
  14. fmt.Println("To int:", r2)
  15. //to float
  16. c := []byte("12.7")
  17. r3 := dtcvt.MustFloat64(c)
  18. fmt.Println("To float:", r3)
  19. }

5、JSON格式化

开源地址:https://github.com/json-iterator/go

实例:

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. import jsoniter "github.com/json-iterator/go"
  7. //用户
  8. type User struct {
  9. UserName string `json:"username"`
  10. NickName string `json:"nickname"`
  11. Age int `json:"age"`
  12. Birthday string `json:"birthday"`
  13. Sex string `json:"sex"`
  14. Email string `json:"email"`
  15. Phone string `json:"phone"`
  16. }
  17. //结构体转JSON
  18. func structToJSON() {
  19. user := User{
  20. UserName: "itbsl",
  21. NickName: "jack",
  22. Age: 18,
  23. Birthday: "2001-08-15",
  24. Sex: "itbsl@gmail.com",
  25. Phone: "176XXXX6688",
  26. }
  27. data, err := json.Marshal(user)
  28. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  29. json.Unmarshal(input, &user)
  30. if err != nil {
  31. fmt.Println("json.marshal failed, err:", err)
  32. return
  33. }
  34. fmt.Printf("%s\n", string(data))
  35. }
  36. func main() {
  37. structToJSON()
  38. }

6、农历

开源地址:https://github.com/6tail/lunar-go

实例:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/6tail/lunar-go/calendar"
  5. )
  6. func main() {
  7. lunar := calendar.NewLunarFromYmd(1986,4,21)
  8. fmt.Println(lunar.ToFullString())
  9. fmt.Println(lunar.GetSolar().ToFullString())
  10. }

7、反向代理

实例:

  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "net/http/httputil"
  6. "net/url"
  7. )
  8. var (
  9. // 建立域名和目标map
  10. hostTarget = map[string]string{
  11. "app1.domain1.com": "http://192.168.1.2/owncloud",
  12. "app2.domain1.com": "http://192.168.1.2:8080",
  13. "app3.domain1.com": "http://192.168.1.2:8888",
  14. }
  15. // 用于缓存 httputil.ReverseProxy
  16. hostProxy map[string]*httputil.ReverseProxy
  17. )
  18. type baseHandle struct{}
  19. func (h *baseHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  20. host := r.Host
  21. // 直接从缓存取出
  22. if fn, ok := hostProxy[host]; ok {
  23. fn.ServeHTTP(w, r)
  24. return
  25. }
  26. // 检查域名白名单
  27. if target, ok := hostTarget[host]; ok {
  28. remoteUrl, err := url.Parse(target)
  29. if err != nil {
  30. log.Println("target parse fail:", err)
  31. return
  32. }
  33. proxy := httputil.NewSingleHostReverseProxy(remoteUrl)
  34. hostProxy[host] = proxy // 放入缓存
  35. proxy.ServeHTTP(w, r)
  36. return
  37. }
  38. w.Write([]byte("403: Host forbidden " + host))
  39. }
  40. func main() {
  41. h := &baseHandle{}
  42. http.Handle("/", h)
  43. server := &http.Server{
  44. Addr: ":8082",
  45. Handler: h,
  46. }
  47. log.Fatal(server.ListenAndServe())
  48. }