Browse Source

[go/hertz] Update hertz version and optimise config (#8483)

* update

* fix hertz-gorm.dockerfile

* add go.sum

* update module name

* remove make other argument

* remove pre-allocated memory
Jiun Lee 1 year ago
parent
commit
5225bd2612
33 changed files with 819 additions and 276 deletions
  1. 2 2
      frameworks/Go/aah/src/benchmark/app/models/models.go
  2. 1 1
      frameworks/Go/atreugo/src/templates/fortune.go
  3. 1 1
      frameworks/Go/chi/src/chi-gojay/server.go
  4. 1 1
      frameworks/Go/chi/src/chi-sjson/server.go
  5. 1 1
      frameworks/Go/chi/src/chi/server.go
  6. 1 1
      frameworks/Go/clevergo/main.go
  7. 1 1
      frameworks/Go/echo/src/main.go
  8. 1 1
      frameworks/Go/fasthttp/src/templates/fortune.go
  9. 1 1
      frameworks/Go/fiber/src/server.go
  10. 1 1
      frameworks/Go/fiber/src/templates/fortune.go
  11. 1 1
      frameworks/Go/gearbox/src/main.go
  12. 1 1
      frameworks/Go/gearbox/src/templates/fortune.go
  13. 7 7
      frameworks/Go/gin/gin-src/hello.go
  14. 7 7
      frameworks/Go/gin/gin-std/main.go
  15. 1 1
      frameworks/Go/go-std/src/storage/mgo.go
  16. 1 1
      frameworks/Go/go-std/src/storage/mysql.go
  17. 1 1
      frameworks/Go/go-std/src/storage/pgx.go
  18. 1 1
      frameworks/Go/go-std/src/storage/pq.go
  19. 1 1
      frameworks/Go/go-std/src/templates/fortune.go
  20. 1 1
      frameworks/Go/goframe/src/template/fortune.go
  21. 2 2
      frameworks/Go/goji/src/goji/server.go
  22. 2 2
      frameworks/Go/hertz/benchmark_config.json
  23. 1 1
      frameworks/Go/hertz/config.toml
  24. 15 10
      frameworks/Go/hertz/go.mod
  25. 106 0
      frameworks/Go/hertz/go.sum
  26. 188 96
      frameworks/Go/hertz/hello.go
  27. 5 5
      frameworks/Go/hertz/hertz-gorm.dockerfile
  28. 10 11
      frameworks/Go/hertz/hertz-gorm/go.mod
  29. 262 0
      frameworks/Go/hertz/hertz-gorm/go.sum
  30. 167 87
      frameworks/Go/hertz/hertz-gorm/main.go
  31. 6 6
      frameworks/Go/hertz/hertz.dockerfile
  32. 1 1
      frameworks/Go/kami/src/kami/server.go
  33. 21 22
      frameworks/Go/revel/src/benchmark/app/controllers/app.go

+ 2 - 2
frameworks/Go/aah/src/benchmark/app/models/models.go

@@ -80,7 +80,7 @@ func MySQLFortunes() (Fortunes, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() {
 	for rows.Next() {
 		var fortune Fortune
 		var fortune Fortune
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
@@ -156,7 +156,7 @@ func PGFortunes() (Fortunes, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() {
 	for rows.Next() {
 		var fortune Fortune
 		var fortune Fortune
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/atreugo/src/templates/fortune.go

@@ -15,7 +15,7 @@ var (
 	fortunesPool = sync.Pool{
 	fortunesPool = sync.Pool{
 		New: func() interface{} {
 		New: func() interface{} {
 			return &Fortunes{
 			return &Fortunes{
-				F: make([]Fortune, 0, 16),
+				F: make([]Fortune, 0),
 			}
 			}
 		},
 		},
 	}
 	}

+ 1 - 1
frameworks/Go/chi/src/chi-gojay/server.go

@@ -132,7 +132,7 @@ func fortunes(w http.ResponseWriter, r *http.Request) {
 		return
 		return
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/chi/src/chi-sjson/server.go

@@ -132,7 +132,7 @@ func fortunes(w http.ResponseWriter, r *http.Request) {
 		return
 		return
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/chi/src/chi/server.go

@@ -132,7 +132,7 @@ func fortunes(w http.ResponseWriter, r *http.Request) {
 		return
 		return
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/clevergo/main.go

@@ -171,7 +171,7 @@ func fortunesHandler(c *clevergo.Context) error {
 	}
 	}
 	defer rows.Close()
 	defer rows.Close()
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { // Fetch rows
 	for rows.Next() { // Fetch rows
 		f := new(Fortune)
 		f := new(Fortune)
 		if err := rows.Scan(&f.ID, &f.Message); err != nil {
 		if err := rows.Scan(&f.ID, &f.Message); err != nil {

+ 1 - 1
frameworks/Go/echo/src/main.go

@@ -242,7 +242,7 @@ func getQueryCount(q string) int {
 }
 }
 
 
 func fetchFortunes(rows *sql.Rows) (Fortunes, error) {
 func fetchFortunes(rows *sql.Rows) (Fortunes, error) {
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { // Fetch rows
 	for rows.Next() { // Fetch rows
 		f := new(Fortune)
 		f := new(Fortune)
 		if err := rows.Scan(&f.ID, &f.Message); err != nil {
 		if err := rows.Scan(&f.ID, &f.Message); err != nil {

+ 1 - 1
frameworks/Go/fasthttp/src/templates/fortune.go

@@ -15,7 +15,7 @@ var (
 	fortunesPool = sync.Pool{
 	fortunesPool = sync.Pool{
 		New: func() interface{} {
 		New: func() interface{} {
 			return &Fortunes{
 			return &Fortunes{
-				F: make([]Fortune, 0, 16),
+				F: make([]Fortune, 0),
 			}
 			}
 		},
 		},
 	}
 	}

+ 1 - 1
frameworks/Go/fiber/src/server.go

@@ -219,7 +219,7 @@ func templateHandler(c *fiber.Ctx) error {
 	rows, _ := db.Query(context.Background(), fortuneselectsql)
 	rows, _ := db.Query(context.Background(), fortuneselectsql)
 
 
 	var f templates.Fortune
 	var f templates.Fortune
-	fortunes := make([]templates.Fortune, 0, 16)
+	fortunes := make([]templates.Fortune, 0)
 	for rows.Next() {
 	for rows.Next() {
 		_ = rows.Scan(&f.ID, &f.Message)
 		_ = rows.Scan(&f.ID, &f.Message)
 		fortunes = append(fortunes, f)
 		fortunes = append(fortunes, f)

+ 1 - 1
frameworks/Go/fiber/src/templates/fortune.go

@@ -24,7 +24,7 @@ var fortunePool = &sync.Pool{
 var fortunesPool = &sync.Pool{
 var fortunesPool = &sync.Pool{
 	New: func() interface{} {
 	New: func() interface{} {
 		return &Fortunes{
 		return &Fortunes{
-			F: make([]Fortune, 0, 16),
+			F: make([]Fortune, 0),
 		}
 		}
 	},
 	},
 }
 }

+ 1 - 1
frameworks/Go/gearbox/src/main.go

@@ -200,7 +200,7 @@ func templateHandler(ctx gearbox.Context) {
 	rows, _ := db.Query(context.Background(), fortuneselectsql)
 	rows, _ := db.Query(context.Background(), fortuneselectsql)
 
 
 	var f templates.Fortune
 	var f templates.Fortune
-	fortunes := make([]templates.Fortune, 0, 16)
+	fortunes := make([]templates.Fortune, 0)
 	for rows.Next() {
 	for rows.Next() {
 		_ = rows.Scan(&f.ID, &f.Message)
 		_ = rows.Scan(&f.ID, &f.Message)
 		fortunes = append(fortunes, f)
 		fortunes = append(fortunes, f)

+ 1 - 1
frameworks/Go/gearbox/src/templates/fortune.go

@@ -24,7 +24,7 @@ var fortunePool = &sync.Pool{
 var fortunesPool = &sync.Pool{
 var fortunesPool = &sync.Pool{
 	New: func() interface{} {
 	New: func() interface{} {
 		return &Fortunes{
 		return &Fortunes{
-			F: make([]Fortune, 0, 16),
+			F: make([]Fortune, 0),
 		}
 		}
 	},
 	},
 }
 }

+ 7 - 7
frameworks/Go/gin/gin-src/hello.go

@@ -61,12 +61,12 @@ func parseQueries(c *gin.Context) int {
 	return n
 	return n
 }
 }
 
 
-/// Test 1: JSON serialization
+// / Test 1: JSON serialization
 func json(c *gin.Context) {
 func json(c *gin.Context) {
 	c.JSON(200, gin.H{"message": "Hello, World!"})
 	c.JSON(200, gin.H{"message": "Hello, World!"})
 }
 }
 
 
-/// Test 2: Single database query
+// / Test 2: Single database query
 func db(c *gin.Context) {
 func db(c *gin.Context) {
 	var world World
 	var world World
 	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.Id, &world.RandomNumber)
 	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.Id, &world.RandomNumber)
@@ -77,7 +77,7 @@ func db(c *gin.Context) {
 	c.JSON(200, &world)
 	c.JSON(200, &world)
 }
 }
 
 
-/// Test 3: Multiple database queries
+// / Test 3: Multiple database queries
 func dbs(c *gin.Context) {
 func dbs(c *gin.Context) {
 	numQueries := parseQueries(c)
 	numQueries := parseQueries(c)
 
 
@@ -92,7 +92,7 @@ func dbs(c *gin.Context) {
 	c.JSON(200, &worlds)
 	c.JSON(200, &worlds)
 }
 }
 
 
-/// Test 4: Fortunes
+// / Test 4: Fortunes
 func fortunes(c *gin.Context) {
 func fortunes(c *gin.Context) {
 	rows, err := fortuneStatement.Query()
 	rows, err := fortuneStatement.Query()
 	if err != nil {
 	if err != nil {
@@ -100,7 +100,7 @@ func fortunes(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {
 		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {
@@ -115,7 +115,7 @@ func fortunes(c *gin.Context) {
 	c.HTML(200, "fortune.html", fortunes)
 	c.HTML(200, "fortune.html", fortunes)
 }
 }
 
 
-/// Test 5: Database updates
+// / Test 5: Database updates
 func update(c *gin.Context) {
 func update(c *gin.Context) {
 	numQueries := parseQueries(c)
 	numQueries := parseQueries(c)
 	world := make([]World, numQueries)
 	world := make([]World, numQueries)
@@ -133,7 +133,7 @@ func update(c *gin.Context) {
 	c.JSON(200, world)
 	c.JSON(200, world)
 }
 }
 
 
-/// Test 6: plaintext
+// / Test 6: plaintext
 func plaintext(c *gin.Context) {
 func plaintext(c *gin.Context) {
 	c.String(200, "Hello, World!")
 	c.String(200, "Hello, World!")
 }
 }

+ 7 - 7
frameworks/Go/gin/gin-std/main.go

@@ -61,12 +61,12 @@ func parseQueries(c *gin.Context) int {
 	return n
 	return n
 }
 }
 
 
-/// Test 1: JSON serialization
+// / Test 1: JSON serialization
 func json(c *gin.Context) {
 func json(c *gin.Context) {
 	c.JSON(200, gin.H{"message": "Hello, World!"})
 	c.JSON(200, gin.H{"message": "Hello, World!"})
 }
 }
 
 
-/// Test 2: Single database query
+// / Test 2: Single database query
 func db(c *gin.Context) {
 func db(c *gin.Context) {
 	var world World
 	var world World
 	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.Id, &world.RandomNumber)
 	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.Id, &world.RandomNumber)
@@ -77,7 +77,7 @@ func db(c *gin.Context) {
 	c.JSON(200, &world)
 	c.JSON(200, &world)
 }
 }
 
 
-/// Test 3: Multiple database queries
+// / Test 3: Multiple database queries
 func dbs(c *gin.Context) {
 func dbs(c *gin.Context) {
 	numQueries := parseQueries(c)
 	numQueries := parseQueries(c)
 
 
@@ -92,7 +92,7 @@ func dbs(c *gin.Context) {
 	c.JSON(200, &worlds)
 	c.JSON(200, &worlds)
 }
 }
 
 
-/// Test 4: Fortunes
+// / Test 4: Fortunes
 func fortunes(c *gin.Context) {
 func fortunes(c *gin.Context) {
 	rows, err := fortuneStatement.Query()
 	rows, err := fortuneStatement.Query()
 	if err != nil {
 	if err != nil {
@@ -100,7 +100,7 @@ func fortunes(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {
 		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {
@@ -115,7 +115,7 @@ func fortunes(c *gin.Context) {
 	c.HTML(200, "fortune.html", fortunes)
 	c.HTML(200, "fortune.html", fortunes)
 }
 }
 
 
-/// Test 5: Database updates
+// / Test 5: Database updates
 func update(c *gin.Context) {
 func update(c *gin.Context) {
 	numQueries := parseQueries(c)
 	numQueries := parseQueries(c)
 	world := make([]World, numQueries)
 	world := make([]World, numQueries)
@@ -133,7 +133,7 @@ func update(c *gin.Context) {
 	c.JSON(200, world)
 	c.JSON(200, world)
 }
 }
 
 
-/// Test 6: plaintext
+// / Test 6: plaintext
 func plaintext(c *gin.Context) {
 func plaintext(c *gin.Context) {
 	c.String(200, "Hello, World!")
 	c.String(200, "Hello, World!")
 }
 }

+ 1 - 1
frameworks/Go/go-std/src/storage/mgo.go

@@ -66,7 +66,7 @@ func (mongo Mongo) UpdateWorlds(selectedWorlds []World) error {
 
 
 // GetFortunes finds all fortunes from table
 // GetFortunes finds all fortunes from table
 func (mongo Mongo) GetFortunes() ([]templates.Fortune, error) {
 func (mongo Mongo) GetFortunes() ([]templates.Fortune, error) {
-	fortunes := make([]templates.Fortune, 0, 16)
+	fortunes := make([]templates.Fortune, 0)
 
 
 	if err := mongo.fortunes.Find(nil).All(&fortunes); err != nil {
 	if err := mongo.fortunes.Find(nil).All(&fortunes); err != nil {
 		return nil, err
 		return nil, err

+ 1 - 1
frameworks/Go/go-std/src/storage/mysql.go

@@ -101,7 +101,7 @@ func (mysql MySQL) GetFortunes() ([]templates.Fortune, error) {
 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 	}
 	}
 
 
-	fortunes := make([]templates.Fortune, 0, 16)
+	fortunes := make([]templates.Fortune, 0)
 	var fortune templates.Fortune
 	var fortune templates.Fortune
 	for rows.Next() {
 	for rows.Next() {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/go-std/src/storage/pgx.go

@@ -118,7 +118,7 @@ func (psql PGX) GetFortunes() ([]templates.Fortune, error) {
 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 	}
 	}
 
 
-	fortunes := make([]templates.Fortune, 0, 16)
+	fortunes := make([]templates.Fortune, 0)
 	var fortune templates.Fortune
 	var fortune templates.Fortune
 	for rows.Next() {
 	for rows.Next() {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/go-std/src/storage/pq.go

@@ -109,7 +109,7 @@ package storage
 // 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 // 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 // 	}
 // 	}
 
 
-// 	fortunes := make([]templates.Fortune, 0, 16)
+// 	fortunes := make([]templates.Fortune, 0)
 // 	var fortune templates.Fortune
 // 	var fortune templates.Fortune
 // 	for rows.Next() {
 // 	for rows.Next() {
 // 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 // 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {

+ 1 - 1
frameworks/Go/go-std/src/templates/fortune.go

@@ -50,7 +50,7 @@ var FortunesPool *sync.Pool
 func InitFortunesPool() {
 func InitFortunesPool() {
 	FortunesPool = &sync.Pool{
 	FortunesPool = &sync.Pool{
 		New: func() interface{} {
 		New: func() interface{} {
-			return make([]Fortune, 0, 16)
+			return make([]Fortune, 0)
 		},
 		},
 	}
 	}
 }
 }

+ 1 - 1
frameworks/Go/goframe/src/template/fortune.go

@@ -15,7 +15,7 @@ var (
 	fortunesPool = sync.Pool{
 	fortunesPool = sync.Pool{
 		New: func() interface{} {
 		New: func() interface{} {
 			return &Fortunes{
 			return &Fortunes{
-				F: make([]Fortune, 0, 16),
+				F: make([]Fortune, 0),
 			}
 			}
 		},
 		},
 	}
 	}

+ 2 - 2
frameworks/Go/goji/src/goji/server.go

@@ -37,7 +37,7 @@ var (
 	// Templates
 	// Templates
 	tmpl = template.Must(template.
 	tmpl = template.Must(template.
 		ParseFiles("templates/layout.html",
 		ParseFiles("templates/layout.html",
-		"templates/fortune.html"))
+			"templates/fortune.html"))
 
 
 	// Database
 	// Database
 	worldStatement   *sql.Stmt
 	worldStatement   *sql.Stmt
@@ -146,7 +146,7 @@ func fortunes(c web.C, w http.ResponseWriter, r *http.Request) {
 		log.Fatalf("Error preparing statement: %v", err)
 		log.Fatalf("Error preparing statement: %v", err)
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 
 
 	for rows.Next() {
 	for rows.Next() {
 		fortune := Fortune{}
 		fortune := Fortune{}

+ 2 - 2
frameworks/Go/hertz/benchmark_config.json

@@ -11,7 +11,7 @@
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Micro",
       "classification": "Micro",
-      "database": "MySQL",
+      "database": "Postgres",
       "framework": "hertz",
       "framework": "hertz",
       "language": "Go",
       "language": "Go",
       "flavor": "None",
       "flavor": "None",
@@ -31,7 +31,7 @@
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Fullstack",
       "classification": "Fullstack",
-      "database": "postgres",
+      "database": "Postgres",
       "framework": "hertz-gorm",
       "framework": "hertz-gorm",
       "language": "Go",
       "language": "Go",
       "flavor": "None",
       "flavor": "None",

+ 1 - 1
frameworks/Go/hertz/config.toml

@@ -10,7 +10,7 @@ urls.update = "/update?queries="
 urls.fortune = "/fortunes"
 urls.fortune = "/fortunes"
 approach = "Realistic"
 approach = "Realistic"
 classification = "Micro"
 classification = "Micro"
-database = "MySQL"
+database = "Postgres"
 database_os = "Linux"
 database_os = "Linux"
 os = "Linux"
 os = "Linux"
 orm = "Raw"
 orm = "Raw"

+ 15 - 10
frameworks/Go/hertz/go.mod

@@ -1,31 +1,36 @@
 module hertz
 module hertz
 
 
-go 1.18
+go 1.20
 
 
 require (
 require (
-	github.com/cloudwego/hertz v0.4.0
-	github.com/go-sql-driver/mysql v1.6.0
+	github.com/cloudwego/hertz v0.7.1
+	github.com/goccy/go-json v0.10.2
+	github.com/jackc/pgx/v5 v5.4.3
 )
 )
 
 
 require (
 require (
 	github.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect
 	github.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect
 	github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect
 	github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect
-	github.com/bytedance/sonic v1.5.0 // indirect
-	github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 // indirect
-	github.com/cloudwego/netpoll v0.2.6 // indirect
+	github.com/bytedance/sonic v1.8.1 // indirect
+	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+	github.com/cloudwego/netpoll v0.5.0 // indirect
 	github.com/fsnotify/fsnotify v1.5.4 // indirect
 	github.com/fsnotify/fsnotify v1.5.4 // indirect
 	github.com/golang/protobuf v1.5.0 // indirect
 	github.com/golang/protobuf v1.5.0 // indirect
 	github.com/henrylee2cn/ameda v1.4.10 // indirect
 	github.com/henrylee2cn/ameda v1.4.10 // indirect
 	github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect
 	github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+	github.com/jackc/puddle/v2 v2.2.1 // indirect
 	github.com/klauspost/cpuid/v2 v2.0.9 // indirect
 	github.com/klauspost/cpuid/v2 v2.0.9 // indirect
 	github.com/nyaruka/phonenumbers v1.0.55 // indirect
 	github.com/nyaruka/phonenumbers v1.0.55 // indirect
-	github.com/stretchr/testify v1.7.1 // indirect
-	github.com/tidwall/gjson v1.13.0 // indirect
+	github.com/tidwall/gjson v1.14.4 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
 	golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
-	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
+	golang.org/x/crypto v0.14.0 // indirect
+	golang.org/x/sync v0.1.0 // indirect
+	golang.org/x/sys v0.13.0 // indirect
+	golang.org/x/text v0.13.0 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
-	gopkg.in/yaml.v3 v3.0.0 // indirect
 )
 )

+ 106 - 0
frameworks/Go/hertz/go.sum

@@ -0,0 +1,106 @@
+github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=
+github.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=
+github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 h1:PtwsQyQJGxf8iaPptPNaduEIu9BnrNms+pcRdHAxZaM=
+github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=
+github.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=
+github.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.8.1 h1:NqAHCaGaTzro0xMmnTCLUyRlbEP6r8MCA1cJUrH3Pu4=
+github.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/cloudwego/hertz v0.7.1 h1:4M8l4zvAE6yNxzfozpxHLMnRSRRPslKNw/McH5/qFns=
+github.com/cloudwego/hertz v0.7.1/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=
+github.com/cloudwego/netpoll v0.5.0 h1:oRrOp58cPCvK2QbMozZNDESvrxQaEHW2dCimmwH1lcU=
+github.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
+github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=
+github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
+github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=
+github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY=
+github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
+github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
+github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=
+github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
+github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

+ 188 - 96
frameworks/Go/hertz/hello.go

@@ -5,31 +5,45 @@ import (
 	"fmt"
 	"fmt"
 	"github.com/cloudwego/hertz/pkg/app"
 	"github.com/cloudwego/hertz/pkg/app"
 	"github.com/cloudwego/hertz/pkg/app/server"
 	"github.com/cloudwego/hertz/pkg/app/server"
+	"github.com/cloudwego/hertz/pkg/app/server/render"
 	"github.com/cloudwego/hertz/pkg/common/config"
 	"github.com/cloudwego/hertz/pkg/common/config"
-	"github.com/cloudwego/hertz/pkg/common/utils"
-	"log"
+	"github.com/cloudwego/hertz/pkg/protocol"
+	"github.com/cloudwego/hertz/pkg/protocol/consts"
+	"github.com/goccy/go-json"
+	"github.com/jackc/pgx/v5"
+	"github.com/jackc/pgx/v5/pgxpool"
 	"math/rand"
 	"math/rand"
 	"runtime"
 	"runtime"
 	"sort"
 	"sort"
-	"strconv"
-
-	"database/sql"
+	"sync"
+	"unsafe"
+)
 
 
-	_ "github.com/go-sql-driver/mysql"
+var (
+	db *pgxpool.Pool
 )
 )
 
 
 const (
 const (
 	// Database
 	// Database
-	worldSelect        = "SELECT id, randomNumber FROM World WHERE id = ?"
-	worldUpdate        = "UPDATE World SET randomNumber = ? WHERE id = ?"
-	fortuneSelect      = "SELECT id, message FROM Fortune;"
-	worldRowCount      = 10000
-	maxConnectionCount = 256
+	helloworld    = "Hello, World!"
+	worldSelect   = "SELECT id, randomNumber FROM World WHERE id = $1"
+	worldUpdate   = "UPDATE World SET randomNumber = $1 WHERE id = $2"
+	fortuneSelect = "SELECT id, message FROM Fortune;"
+
+	worldRowCount = 10000
+	jsonpath      = "/json"
+	dbpath        = "/db"
+	dbspath       = "/dbs"
+	fortunespath  = "/fortunes"
+	updatepath    = "/update"
+	plaintextpath = "/plaintext"
 )
 )
 
 
+var helloworldRaw = []byte("Hello, World!")
+
 type World struct {
 type World struct {
-	Id           uint16 `json:"id"`
-	RandomNumber uint16 `json:"randomNumber"`
+	Id           int32 `json:"id"`
+	RandomNumber int32 `json:"randomNumber"`
 }
 }
 
 
 type Fortune struct {
 type Fortune struct {
@@ -38,6 +52,7 @@ type Fortune struct {
 }
 }
 
 
 type Fortunes []*Fortune
 type Fortunes []*Fortune
+type Worlds []World
 
 
 func (s Fortunes) Len() int      { return len(s) }
 func (s Fortunes) Len() int      { return len(s) }
 func (s Fortunes) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
 func (s Fortunes) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
@@ -46,18 +61,9 @@ type ByMessage struct{ Fortunes }
 
 
 func (s ByMessage) Less(i, j int) bool { return s.Fortunes[i].Message < s.Fortunes[j].Message }
 func (s ByMessage) Less(i, j int) bool { return s.Fortunes[i].Message < s.Fortunes[j].Message }
 
 
-var (
-	// Database
-	worldStatement   *sql.Stmt
-	fortuneStatement *sql.Stmt
-	updateStatement  *sql.Stmt
-)
-
 func parseQueries(c context.Context, ctx *app.RequestContext) int {
 func parseQueries(c context.Context, ctx *app.RequestContext) int {
-	n, err := strconv.Atoi(ctx.Query("queries"))
-	if err != nil {
-		n = 1
-	} else if n < 1 {
+	n := GetUintOrZeroFromArgs(ctx.QueryArgs(), "queries")
+	if n < 1 {
 		n = 1
 		n = 1
 	} else if n > 500 {
 	} else if n > 500 {
 		n = 500
 		n = 500
@@ -66,122 +72,208 @@ func parseQueries(c context.Context, ctx *app.RequestContext) int {
 }
 }
 
 
 // / Test 1: JSON serialization
 // / Test 1: JSON serialization
-func json(c context.Context, ctx *app.RequestContext) {
-	ctx.JSON(200, utils.H{"message": "Hello, World!"})
+func jsonhandler(c context.Context, ctx *app.RequestContext) {
+	m := AcquireJSON()
+	m.Message = helloworld
+	ctx.JSON(200, &m)
+	ReleaseJSON(m)
 }
 }
 
 
 // / Test 2: Single database query
 // / Test 2: Single database query
-func db(c context.Context, ctx *app.RequestContext) {
-	var world World
-	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.Id, &world.RandomNumber)
-	if err != nil {
-		ctx.AbortWithError(500, err)
-		return
-	}
+func dbHandler(c context.Context, ctx *app.RequestContext) {
+	world := AcquireWorld()
+	db.QueryRow(context.Background(), worldSelect, RandomWorld()).Scan(&world.Id, &world.RandomNumber)
 	ctx.JSON(200, &world)
 	ctx.JSON(200, &world)
+	ReleaseWorld(world)
 }
 }
 
 
 // / Test 3: Multiple database queries
 // / Test 3: Multiple database queries
 func dbs(c context.Context, ctx *app.RequestContext) {
 func dbs(c context.Context, ctx *app.RequestContext) {
-	numQueries := parseQueries(c, ctx)
-
-	worlds := make([]World, numQueries)
-	for i := 0; i < numQueries; i++ {
-		err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].Id, &worlds[i].RandomNumber)
-		if err != nil {
-			ctx.AbortWithError(500, err)
-			return
-		}
+	n := parseQueries(c, ctx)
+	worlds := AcquireWorlds()[:n]
+	for i := 0; i < n; i++ {
+		w := &worlds[i]
+		db.QueryRow(context.Background(), worldSelect, RandomWorld()).Scan(&w.Id, &w.RandomNumber)
 	}
 	}
 	ctx.JSON(200, &worlds)
 	ctx.JSON(200, &worlds)
+	ReleaseWorlds(worlds)
 }
 }
 
 
 // / Test 4: Fortunes
 // / Test 4: Fortunes
 func fortunes(c context.Context, ctx *app.RequestContext) {
 func fortunes(c context.Context, ctx *app.RequestContext) {
-	rows, err := fortuneStatement.Query()
-	if err != nil {
-		ctx.AbortWithError(500, err)
-		return
-	}
-
-	fortunes := make(Fortunes, 0, 16)
+	rows, _ := db.Query(context.Background(), fortuneSelect)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
-		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {
-			ctx.AbortWithError(500, err)
-			return
-		}
+		_ = rows.Scan(&fortune.Id, &fortune.Message)
 		fortunes = append(fortunes, &fortune)
 		fortunes = append(fortunes, &fortune)
 	}
 	}
 	fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."})
 	fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."})
-
-	sort.Sort(ByMessage{fortunes})
+	sort.Slice(fortunes, func(i, j int) bool {
+		return fortunes[i].Message < fortunes[j].Message
+	})
 	ctx.HTML(200, "fortune.html", fortunes)
 	ctx.HTML(200, "fortune.html", fortunes)
 }
 }
 
 
 // / Test 5: Database updates
 // / Test 5: Database updates
 func update(c context.Context, ctx *app.RequestContext) {
 func update(c context.Context, ctx *app.RequestContext) {
-	numQueries := parseQueries(c, ctx)
-	world := make([]World, numQueries)
-	for i := 0; i < numQueries; i++ {
-		if err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world[i].Id, &world[i].RandomNumber); err != nil {
-			ctx.AbortWithError(500, err)
-			return
-		}
-		world[i].RandomNumber = uint16(rand.Intn(worldRowCount) + 1)
-		if _, err := updateStatement.Exec(world[i].RandomNumber, world[i].Id); err != nil {
-			ctx.AbortWithError(500, err)
-			return
-		}
+	n := parseQueries(c, ctx)
+	worlds := AcquireWorlds()[:n]
+	for i := 0; i < n; i++ {
+		w := &worlds[i]
+		db.QueryRow(context.Background(), worldSelect, RandomWorld()).Scan(&w.Id, &w.RandomNumber)
+		w.RandomNumber = int32(RandomWorld())
+	}
+
+	// sorting is required for insert deadlock prevention.
+	sort.Slice(worlds, func(i, j int) bool {
+		return worlds[i].Id < worlds[j].Id
+	})
+	batch := pgx.Batch{}
+	for _, w := range worlds {
+		batch.Queue(worldUpdate, w.RandomNumber, w.Id)
 	}
 	}
-	ctx.JSON(200, world)
+	db.SendBatch(context.Background(), &batch).Close()
+	ctx.JSON(200, &worlds)
+	ReleaseWorlds(worlds)
 }
 }
 
 
 // / Test 6: plaintext
 // / Test 6: plaintext
 func plaintext(c context.Context, ctx *app.RequestContext) {
 func plaintext(c context.Context, ctx *app.RequestContext) {
-	ctx.String(200, "Hello, World!")
+	ctx.SetStatusCode(consts.StatusOK)
+	ctx.Response.SetBodyString(helloworld)
 }
 }
 
 
 func main() {
 func main() {
 	h := server.New(config.Option{F: func(o *config.Options) {
 	h := server.New(config.Option{F: func(o *config.Options) {
 		o.Addr = ":8080"
 		o.Addr = ":8080"
-	},
-	})
-	serverHeader := []string{"Hertz"}
+		o.DisableHeaderNamesNormalizing = true
+	}})
+	render.ResetJSONMarshal(json.Marshal)
 	h.Use(func(c context.Context, ctx *app.RequestContext) {
 	h.Use(func(c context.Context, ctx *app.RequestContext) {
-		ctx.Header("Server", serverHeader[0])
+		switch b2s(ctx.Path()) {
+		case plaintextpath:
+			plaintext(c, ctx)
+		case jsonpath:
+			jsonhandler(c, ctx)
+		case dbpath:
+			dbHandler(c, ctx)
+		case dbspath:
+			dbs(c, ctx)
+		case updatepath:
+			update(c, ctx)
+		case fortunespath:
+			fortunes(c, ctx)
+		}
 	})
 	})
 	h.LoadHTMLGlob("/templates/fortune.html")
 	h.LoadHTMLGlob("/templates/fortune.html")
-	h.GET("/json", json)
-	h.GET("/db", db)
-	h.GET("/dbs", dbs)
-	h.GET("/fortunes", fortunes)
-	h.GET("/update", update)
-	h.GET("/plaintext", plaintext)
 	h.Spin()
 	h.Spin()
 }
 }
 
 
 func init() {
 func init() {
-	runtime.GOMAXPROCS(runtime.NumCPU())
+	maxConn := runtime.NumCPU() * 4
 
 
-	dsn := "benchmarkdbuser:benchmarkdbpass@tcp(%s:3306)/hello_world"
-	dbhost := "tfb-database"
-
-	db, err := sql.Open("mysql", fmt.Sprintf(dsn, dbhost))
-	if err != nil {
-		log.Fatalf("Error opening database: %v", err)
-	}
-	db.SetMaxIdleConns(maxConnectionCount)
-	worldStatement, err = db.Prepare(worldSelect)
+	var err error
+	db, err = pgxpool.New(context.Background(),
+		fmt.Sprintf(
+			"host=%s port=%d user=%s password=%s dbname=%s pool_max_conns=%d",
+			"tfb-database", 5432,
+			"benchmarkdbuser",
+			"benchmarkdbpass",
+			"hello_world",
+			maxConn,
+		))
 	if err != nil {
 	if err != nil {
-		log.Fatal(err)
+		panic(err)
 	}
 	}
-	fortuneStatement, err = db.Prepare(fortuneSelect)
-	if err != nil {
-		log.Fatal(err)
+}
+
+type Message struct {
+	Message string `json:"message"`
+}
+
+// JSONpool ...
+var JSONpool = sync.Pool{
+	New: func() interface{} {
+		return new(Message)
+	},
+}
+
+// AcquireJSON ...
+func AcquireJSON() *Message {
+	return JSONpool.Get().(*Message)
+}
+
+// ReleaseJSON ...
+func ReleaseJSON(json *Message) {
+	json.Message = ""
+	JSONpool.Put(json)
+}
+
+// WorldPool ...
+var WorldPool = sync.Pool{
+	New: func() interface{} {
+		return new(World)
+	},
+}
+
+// AcquireWorld ...
+func AcquireWorld() *World {
+	return WorldPool.Get().(*World)
+}
+
+// ReleaseWorld ...
+func ReleaseWorld(w *World) {
+	w.Id = 0
+	w.RandomNumber = 0
+	WorldPool.Put(w)
+}
+
+// WorldsPool ...
+var WorldsPool = sync.Pool{
+	New: func() interface{} {
+		return make(Worlds, 0, 500)
+	},
+}
+
+// AcquireWorlds ...
+func AcquireWorlds() Worlds {
+	return WorldsPool.Get().(Worlds)
+}
+
+// ReleaseWorlds ...ReleaseWorlds
+func ReleaseWorlds(w Worlds) {
+	w = w[:0]
+	WorldsPool.Put(w)
+}
+
+func b2s(b []byte) string {
+	return unsafe.String(unsafe.SliceData(b), len(b))
+}
+
+// RandomWorld :
+func RandomWorld() int {
+	return rand.Intn(worldRowCount) + 1
+}
+
+func GetUintOrZeroFromArgs(a *protocol.Args, key string) int {
+	b := a.Peek(key)
+	n := len(b)
+	if n == 0 {
+		return 0
 	}
 	}
-	updateStatement, err = db.Prepare(worldUpdate)
-	if err != nil {
-		log.Fatal(err)
+	v := 0
+	for i := 0; i < n; i++ {
+		c := b[i]
+		k := c - '0'
+		if k > 9 {
+			return 0
+		}
+		vNew := 10*v + int(k)
+		if vNew < v {
+			return 0
+		}
+		v = vNew
 	}
 	}
+	return v
 }
 }

+ 5 - 5
frameworks/Go/hertz/hertz-gorm.dockerfile

@@ -1,12 +1,12 @@
-FROM golang:1.18
+FROM golang:1.20
 
 
 ENV GO111MODULE=on
 ENV GO111MODULE=on
 WORKDIR /src/
 WORKDIR /src/
 ADD ./hertz-gorm /src/
 ADD ./hertz-gorm /src/
 
 
-RUN go mod tidy
-#- original submission
-RUN go build -o app
-#RUN go build -tags=jsoniter -o app - tryed this but slower on my pc
+RUN go mod download
+RUN GOAMD64=v3 go build -o app
+
+EXPOSE 8080
 
 
 ENTRYPOINT ["/src/app"]
 ENTRYPOINT ["/src/app"]

+ 10 - 11
frameworks/Go/hertz/hertz-gorm/go.mod

@@ -1,19 +1,20 @@
-module gin-gorm/main
+module hertz-gorm/main
 
 
-go 1.18
+go 1.19
 
 
 require (
 require (
-	github.com/cloudwego/hertz v0.4.0
+	github.com/cloudwego/hertz v0.7.0
+	github.com/goccy/go-json v0.10.2
 	gorm.io/driver/postgres v1.4.5
 	gorm.io/driver/postgres v1.4.5
-	gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755
+	gorm.io/gorm v1.25.4
 )
 )
 
 
 require (
 require (
 	github.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect
 	github.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect
 	github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect
 	github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect
-	github.com/bytedance/sonic v1.5.0 // indirect
-	github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 // indirect
-	github.com/cloudwego/netpoll v0.2.6 // indirect
+	github.com/bytedance/sonic v1.8.1 // indirect
+	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+	github.com/cloudwego/netpoll v0.5.0 // indirect
 	github.com/fsnotify/fsnotify v1.5.4 // indirect
 	github.com/fsnotify/fsnotify v1.5.4 // indirect
 	github.com/golang/protobuf v1.5.0 // indirect
 	github.com/golang/protobuf v1.5.0 // indirect
 	github.com/henrylee2cn/ameda v1.4.10 // indirect
 	github.com/henrylee2cn/ameda v1.4.10 // indirect
@@ -27,11 +28,10 @@ require (
 	github.com/jackc/pgtype v1.12.0 // indirect
 	github.com/jackc/pgtype v1.12.0 // indirect
 	github.com/jackc/pgx/v4 v4.17.2 // indirect
 	github.com/jackc/pgx/v4 v4.17.2 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
-	github.com/jinzhu/now v1.1.4 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/klauspost/cpuid/v2 v2.0.9 // indirect
 	github.com/klauspost/cpuid/v2 v2.0.9 // indirect
 	github.com/nyaruka/phonenumbers v1.0.55 // indirect
 	github.com/nyaruka/phonenumbers v1.0.55 // indirect
-	github.com/stretchr/testify v1.8.0 // indirect
-	github.com/tidwall/gjson v1.13.0 // indirect
+	github.com/tidwall/gjson v1.14.4 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
@@ -40,5 +40,4 @@ require (
 	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
 	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
 	golang.org/x/text v0.3.7 // indirect
 	golang.org/x/text v0.3.7 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
-	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
 )

+ 262 - 0
frameworks/Go/hertz/hertz-gorm/go.sum

@@ -0,0 +1,262 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
+github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
+github.com/bytedance/go-tagexpr/v2 v2.9.2 h1:QySJaAIQgOEDQBLS3x9BxOWrnhqu5sQ+f6HaZIxD39I=
+github.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM=
+github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 h1:PtwsQyQJGxf8iaPptPNaduEIu9BnrNms+pcRdHAxZaM=
+github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q=
+github.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw=
+github.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.8.1 h1:NqAHCaGaTzro0xMmnTCLUyRlbEP6r8MCA1cJUrH3Pu4=
+github.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/cloudwego/hertz v0.7.0 h1:9LFXPqHkGBNH/k/Y1h3udEloS5LVPNOUWekDfH0bQNM=
+github.com/cloudwego/hertz v0.7.0/go.mod h1:WliNtVbwihWHHgAaIQEbVXl0O3aWj0ks1eoPrcEAnjs=
+github.com/cloudwego/netpoll v0.5.0 h1:oRrOp58cPCvK2QbMozZNDESvrxQaEHW2dCimmwH1lcU=
+github.com/cloudwego/netpoll v0.5.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ=
+github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
+github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
+github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=
+github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
+github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=
+github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=
+github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
+github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
+github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
+github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
+github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
+github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
+github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
+github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
+github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=
+github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
+github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
+github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
+github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
+github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
+github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
+github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
+github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
+github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
+github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
+github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
+github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
+github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
+github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
+github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=
+github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=
+github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=
+github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
+github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
+github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc=
+gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg=
+gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
+gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw=
+gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

+ 167 - 87
frameworks/Go/hertz/hertz-gorm/main.go

@@ -2,15 +2,26 @@ package main
 
 
 import (
 import (
 	"context"
 	"context"
-	"fmt"
 	"github.com/cloudwego/hertz/pkg/app"
 	"github.com/cloudwego/hertz/pkg/app"
 	"github.com/cloudwego/hertz/pkg/app/server"
 	"github.com/cloudwego/hertz/pkg/app/server"
+	"github.com/cloudwego/hertz/pkg/app/server/render"
 	"github.com/cloudwego/hertz/pkg/common/config"
 	"github.com/cloudwego/hertz/pkg/common/config"
-	"github.com/cloudwego/hertz/pkg/common/utils"
-	postgres "gorm.io/driver/postgres"
+	"github.com/cloudwego/hertz/pkg/protocol"
+	"github.com/goccy/go-json"
+	"gorm.io/driver/postgres"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
 	"gorm.io/gorm/logger"
 	"math/rand"
 	"math/rand"
+	"sync"
+	"unsafe"
+)
+
+const (
+	helloworld = "Hello, World!"
+)
+
+var (
+	db *gorm.DB
 )
 )
 
 
 // World represents an entry int the World table
 // World represents an entry int the World table
@@ -25,7 +36,7 @@ func (World) TableName() string {
 }
 }
 
 
 // implements the basic logic behind the query tests
 // implements the basic logic behind the query tests
-func getWorld(db *gorm.DB) World {
+func getWorld(db *gorm.DB) *World {
 	// we could actually precompute a list of random
 	// we could actually precompute a list of random
 	// numbers and slice them but this makes no sense
 	// numbers and slice them but this makes no sense
 	// as I expect that this 'random' is just a placeholder
 	// as I expect that this 'random' is just a placeholder
@@ -35,11 +46,11 @@ func getWorld(db *gorm.DB) World {
 	var world World
 	var world World
 	db.Take(&world, randomId)
 	db.Take(&world, randomId)
 
 
-	return world
+	return &world
 }
 }
 
 
 // implements the logic behind the updates tests
 // implements the logic behind the updates tests
-func processWorld(tx *gorm.DB) (World, error) {
+func processWorld(tx *gorm.DB) *World {
 	// we could actually precompute a list of random
 	// we could actually precompute a list of random
 	// numbers and slice them but this makes no sense
 	// numbers and slice them but this makes no sense
 	// as I expect that this 'random' is just a placeholder
 	// as I expect that this 'random' is just a placeholder
@@ -51,110 +62,179 @@ func processWorld(tx *gorm.DB) (World, error) {
 	tx.Take(&world, randomId)
 	tx.Take(&world, randomId)
 
 
 	world.RandomNumber = randomId2
 	world.RandomNumber = randomId2
-	err := tx.Save(&world).Error
+	_ = tx.Save(&world)
+
+	return &world
+}
+
+func jsonhandler(c context.Context, ctx *app.RequestContext) {
+	m := AcquireJSON()
+	m.Message = helloworld
+	ctx.JSON(200, &m)
+	ReleaseJSON(m)
+}
 
 
-	return world, err
+func plaintext(c context.Context, ctx *app.RequestContext) {
+	ctx.SetStatusCode(200)
+	ctx.SetBodyString("Hello, World!")
 }
 }
 
 
+func dbHandler(c context.Context, ctx *app.RequestContext) {
+	world := AcquireWorld()
+	world = getWorld(db)
+	ctx.JSON(200, &world)
+	ReleaseWorld(world)
+}
+
+func parseQueries(c context.Context, ctx *app.RequestContext) int {
+	n := getUintOrZeroFromArgs(ctx.QueryArgs(), "queries")
+	if n < 1 {
+		n = 1
+	} else if n > 500 {
+		n = 500
+	}
+	return n
+}
+
+func queries(c context.Context, ctx *app.RequestContext) {
+	n := parseQueries(c, ctx)
+	worlds := AcquireWorlds()[:n]
+	for i := 0; i < n; i++ {
+		world := getWorld(db)
+		worlds[i] = *world
+	}
+	ctx.JSON(200, &worlds)
+	ReleaseWorlds(worlds)
+}
+
+func updates(c context.Context, ctx *app.RequestContext) {
+	n := parseQueries(c, ctx)
+	worlds := AcquireWorlds()[:n]
+	for i := 0; i < n; i++ {
+		world := processWorld(db)
+		worlds[i] = *world
+	}
+
+	ctx.JSON(200, &worlds)
+	ReleaseWorlds(worlds)
+}
 func main() {
 func main() {
 	/* SETUP DB AND WEB SERVER */
 	/* SETUP DB AND WEB SERVER */
-
 	dsn := "host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world port=5432 sslmode=disable"
 	dsn := "host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world port=5432 sslmode=disable"
-	db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
+	db, _ = gorm.Open(postgres.Open(dsn), &gorm.Config{
 		PrepareStmt: true,                                  // use prep statements
 		PrepareStmt: true,                                  // use prep statements
 		Logger:      logger.Default.LogMode(logger.Silent), // new, not inserted in original submission 2x on query
 		Logger:      logger.Default.LogMode(logger.Silent), // new, not inserted in original submission 2x on query
 	})
 	})
 
 
-	if err != nil {
-		panic("failed to connect database")
-	}
-
-	sqlDB, err := db.DB()
-	if err != nil {
-		panic("failed to get underlying db conn pooling struct")
-	}
+	sqlDB, _ := db.DB()
 
 
-	// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
 	sqlDB.SetMaxIdleConns(500)
 	sqlDB.SetMaxIdleConns(500)
 
 
 	h := server.New(config.Option{F: func(o *config.Options) {
 	h := server.New(config.Option{F: func(o *config.Options) {
 		o.Addr = ":8080"
 		o.Addr = ":8080"
-	}}) // use default middleware
-
-	// setup middleware to add server header
-	// this slows things a little, but it is the best design decision
-	serverHeader := []string{"Hertz-gorm"}
+		o.DisableHeaderNamesNormalizing = true
+	}})
+	render.ResetJSONMarshal(json.Marshal)
 	h.Use(func(c context.Context, ctx *app.RequestContext) {
 	h.Use(func(c context.Context, ctx *app.RequestContext) {
-		ctx.Header("Server", serverHeader[0])
+		switch b2S(ctx.Path()) {
+		case "/json":
+			jsonhandler(c, ctx)
+		case "/plaintext":
+			plaintext(c, ctx)
+		case "/db":
+			dbHandler(c, ctx)
+		case "/queries":
+			queries(c, ctx)
+		case "/updates":
+			updates(c, ctx)
+		}
 	})
 	})
+	h.Spin()
+}
 
 
-	/* START TESTS */
-	// JSON TEST
-	h.GET("/json", func(c context.Context, ctx *app.RequestContext) {
-		// ctx.Header("Server", "example") - original submission now using middleware
-		ctx.JSON(200, utils.H{"message": "Hello, World!"})
-	})
-	// PLAINTEXT TEST
-	h.GET("/plaintext", func(c context.Context, ctx *app.RequestContext) {
-		// ctx.Header("Server", "example") - original submission now using middleware
-		ctx.String(200, "Hello, World!")
-	})
-	// SINGLE QUERY
-	h.GET("/db", func(c context.Context, ctx *app.RequestContext) {
-		world := getWorld(db)
-		// ctx.Header("Server", "example") - original submission now using middleware
-		ctx.JSON(200, world)
-	})
+func b2S(b []byte) string {
+	return *(*string)(unsafe.Pointer(&b))
+}
 
 
-	type NumOf struct {
-		Queries int `form:"queries" query:"queries"`
-	}
-	// MULTIPLE QUERIES
-	h.GET("/queries", func(c context.Context, ctx *app.RequestContext) {
-		var numOf NumOf
-		if ctx.Bind(&numOf) != nil { // manage missing query num
-			numOf.Queries = 1
-		} else if numOf.Queries < 1 { // set at least 1
-			numOf.Queries = 1
-		} else if numOf.Queries > 500 { // set no more than 500
-			numOf.Queries = 500
-		}
+type Message struct {
+	Message string `json:"message"`
+}
 
 
-		worlds := make([]World, numOf.Queries)
-		for i := 0; i < numOf.Queries; i++ {
-			worlds[i] = getWorld(db)
-		}
-		ctx.JSON(200, &worlds)
-	})
-	// MULTIPLE UPDATES
-	h.GET("/updates", func(c context.Context, ctx *app.RequestContext) {
-		var numOf NumOf
-
-		if ctx.Bind(&numOf) != nil { // manage missing query num
-			numOf.Queries = 1
-		} else if numOf.Queries < 1 { // set at least 1
-			numOf.Queries = 1
-		} else if numOf.Queries > 500 { // set no more than 500
-			numOf.Queries = 500
-		}
+type Worlds []World
 
 
-		worlds := make([]World, numOf.Queries, numOf.Queries) // prealloc
-		var err error = nil
+// JSONpool ...
+var JSONpool = sync.Pool{
+	New: func() interface{} {
+		return new(Message)
+	},
+}
 
 
-		for i := 0; i < numOf.Queries; i++ {
-			worlds[i], err = processWorld(db)
+// AcquireJSON ...
+func AcquireJSON() *Message {
+	return JSONpool.Get().(*Message)
+}
 
 
-			if err != nil {
-				fmt.Println(err)
-				ctx.JSON(500, utils.H{"error": err})
-				break
-			}
-		}
+// ReleaseJSON ...
+func ReleaseJSON(json *Message) {
+	json.Message = ""
+	JSONpool.Put(json)
+}
 
 
-		ctx.JSON(200, worlds)
-	})
+// WorldPool ...
+var WorldPool = sync.Pool{
+	New: func() interface{} {
+		return new(World)
+	},
+}
 
 
-	/* START SERVICE */
+// AcquireWorld ...
+func AcquireWorld() *World {
+	return WorldPool.Get().(*World)
+}
+
+// ReleaseWorld ...
+func ReleaseWorld(w *World) {
+	w.ID = 0
+	w.RandomNumber = 0
+	WorldPool.Put(w)
+}
+
+// WorldsPool ...
+var WorldsPool = sync.Pool{
+	New: func() interface{} {
+		return make(Worlds, 0, 500)
+	},
+}
+
+// AcquireWorlds ...
+func AcquireWorlds() Worlds {
+	return WorldsPool.Get().(Worlds)
+}
 
 
-	h.Spin() // listen and serve on 0.0.0.0:8080
-}
+// ReleaseWorlds ...ReleaseWorlds
+func ReleaseWorlds(w Worlds) {
+	w = w[:0]
+	WorldsPool.Put(w)
+}
+
+func getUintOrZeroFromArgs(a *protocol.Args, key string) int {
+	b := a.Peek(key)
+	n := len(b)
+	if n == 0 {
+		return 0
+	}
+	v := 0
+	for i := 0; i < n; i++ {
+		c := b[i]
+		k := c - '0'
+		if k > 9 {
+			return 0
+		}
+		vNew := 10*v + int(k)
+		if vNew < v {
+			return 0
+		}
+		v = vNew
+	}
+	return v
+}

+ 6 - 6
frameworks/Go/hertz/hertz.dockerfile

@@ -1,15 +1,15 @@
-FROM golang:1.18
+FROM docker.io/golang:1.20
+
+WORKDIR /hertz
 
 
 ENV GO111MODULE=on
 ENV GO111MODULE=on
 
 
 ADD ./ /hertz
 ADD ./ /hertz
 COPY ./templates /templates
 COPY ./templates /templates
-WORKDIR /hertz
-
-RUN go mod tidy
 
 
-RUN go build -o hello hello.go
+RUN go mod download
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
-CMD ./hello
+CMD ./app

+ 1 - 1
frameworks/Go/kami/src/kami/server.go

@@ -129,7 +129,7 @@ func fortuneHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
 		log.Fatalf("Error preparing statement: %v", err)
 		log.Fatalf("Error preparing statement: %v", err)
 	}
 	}
 
 
-	fortunes := make(Fortunes, 0, 16)
+	fortunes := make(Fortunes, 0)
 	for rows.Next() { //Fetch rows
 	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {
 		if err := rows.Scan(&fortune.Id, &fortune.Message); err != nil {

+ 21 - 22
frameworks/Go/revel/src/benchmark/app/controllers/app.go

@@ -7,7 +7,6 @@ import (
 
 
 	dbm "benchmark/app/db"
 	dbm "benchmark/app/db"
 
 
-	"github.com/revel/modules/db/app"
 	"github.com/revel/revel"
 	"github.com/revel/revel"
 )
 )
 
 
@@ -84,13 +83,13 @@ func (c App) Plaintext() revel.Result {
 }
 }
 
 
 func (c App) Db(queries int) revel.Result {
 func (c App) Db(queries int) revel.Result {
-        _, foundQuery := c.Params.Values["queries"]
-        if queries>500 {
-             queries = 500
-        }
-        if queries == 0 {
-          queries = 1
-        }
+	_, foundQuery := c.Params.Values["queries"]
+	if queries > 500 {
+		queries = 500
+	}
+	if queries == 0 {
+		queries = 1
+	}
 	ww := make([]World, queries)
 	ww := make([]World, queries)
 	for i := 0; i < queries; i++ {
 	for i := 0; i < queries; i++ {
 		err := worldStatement.QueryRow(rand.Intn(WorldRowCount)+1).
 		err := worldStatement.QueryRow(rand.Intn(WorldRowCount)+1).
@@ -99,19 +98,19 @@ func (c App) Db(queries int) revel.Result {
 			c.Log.Fatalf("Error scanning world row: %v", err)
 			c.Log.Fatalf("Error scanning world row: %v", err)
 		}
 		}
 	}
 	}
-        if !foundQuery {
-            return c.RenderJSON(ww[0])
-        }
+	if !foundQuery {
+		return c.RenderJSON(ww[0])
+	}
 	return c.RenderJSON(ww)
 	return c.RenderJSON(ww)
 }
 }
 
 
 func (c App) Update(queries int) revel.Result {
 func (c App) Update(queries int) revel.Result {
-        _, foundQuery := c.Params.Values["queries"]
-        if queries>500 {
-             queries = 500
-        } else if queries == 0 {
-             queries = 1
-        }
+	_, foundQuery := c.Params.Values["queries"]
+	if queries > 500 {
+		queries = 500
+	} else if queries == 0 {
+		queries = 1
+	}
 	ww := make([]World, queries)
 	ww := make([]World, queries)
 	for i := 0; i < queries; i++ {
 	for i := 0; i < queries; i++ {
 		err := worldStatement.QueryRow(rand.Intn(WorldRowCount)+1).
 		err := worldStatement.QueryRow(rand.Intn(WorldRowCount)+1).
@@ -122,14 +121,14 @@ func (c App) Update(queries int) revel.Result {
 		ww[i].RandomNumber = uint16(rand.Intn(WorldRowCount) + 1)
 		ww[i].RandomNumber = uint16(rand.Intn(WorldRowCount) + 1)
 		updateStatement.Exec(ww[i].RandomNumber, ww[i].Id)
 		updateStatement.Exec(ww[i].RandomNumber, ww[i].Id)
 	}
 	}
-        if !foundQuery {
-            return c.RenderJSON(ww[0])
-        }
-        return c.RenderJSON(ww)
+	if !foundQuery {
+		return c.RenderJSON(ww[0])
+	}
+	return c.RenderJSON(ww)
 }
 }
 
 
 func (c App) Fortune() revel.Result {
 func (c App) Fortune() revel.Result {
-	fortunes := make([]*Fortune, 0, 16)
+	fortunes := make([]*Fortune, 0)
 
 
 	rows, err := fortuneStatement.Query()
 	rows, err := fortuneStatement.Query()
 	if err != nil {
 	if err != nil {