Browse Source

all golang framework update to 1.14 of golang version (#5617)

* all golang framework update to 1.14 of golang version

* recover

* fix chi

* fix chi issues and adopt MySQL as testcase
TonyYang 5 years ago
parent
commit
b65b8349c1
43 changed files with 265 additions and 364 deletions
  1. 1 1
      frameworks/Go/aah/aah-mysql.dockerfile
  2. 1 1
      frameworks/Go/aah/aah-postgresql.dockerfile
  3. 1 1
      frameworks/Go/aah/aah.dockerfile
  4. 1 1
      frameworks/Go/beego/beego-orm-mysql.dockerfile
  5. 1 1
      frameworks/Go/beego/beego.dockerfile
  6. 24 30
      frameworks/Go/chi/benchmark_config.json
  7. 2 2
      frameworks/Go/chi/chi-gojay-prefork.dockerfile
  8. 2 2
      frameworks/Go/chi/chi-gojay.dockerfile
  9. 2 2
      frameworks/Go/chi/chi-prefork.dockerfile
  10. 2 2
      frameworks/Go/chi/chi-sjson-prefork.dockerfile
  11. 2 2
      frameworks/Go/chi/chi-sjson.dockerfile
  12. 1 1
      frameworks/Go/chi/chi.dockerfile
  13. 27 22
      frameworks/Go/chi/src/chi-gojay/db.go
  14. 42 90
      frameworks/Go/chi/src/chi-gojay/server.go
  15. 27 22
      frameworks/Go/chi/src/chi-sjson/db.go
  16. 42 91
      frameworks/Go/chi/src/chi-sjson/server.go
  17. 27 22
      frameworks/Go/chi/src/chi/db.go
  18. 35 46
      frameworks/Go/chi/src/chi/server.go
  19. 1 1
      frameworks/Go/echo/echo.dockerfile
  20. 1 1
      frameworks/Go/falcore/falcore.dockerfile
  21. 1 1
      frameworks/Go/fiber/fiber-prefork.dockerfile
  22. 1 1
      frameworks/Go/fiber/fiber.dockerfile
  23. 1 1
      frameworks/Go/gin/gin.dockerfile
  24. 1 1
      frameworks/Go/go-std/go-mgo-prefork.dockerfile
  25. 1 1
      frameworks/Go/go-std/go-mgo.dockerfile
  26. 1 1
      frameworks/Go/go-std/go-my-prefork.dockerfile
  27. 1 1
      frameworks/Go/go-std/go-my.dockerfile
  28. 1 1
      frameworks/Go/go-std/go-pgx-easyjson.dockerfile
  29. 1 1
      frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile
  30. 1 1
      frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile
  31. 1 1
      frameworks/Go/go-std/go-pgx-prefork.dockerfile
  32. 1 1
      frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile
  33. 1 1
      frameworks/Go/go-std/go-pgx.dockerfile
  34. 1 1
      frameworks/Go/go-std/go.dockerfile
  35. 1 1
      frameworks/Go/goji/goji.dockerfile
  36. 1 1
      frameworks/Go/kami/kami.dockerfile
  37. 1 1
      frameworks/Go/martini/martini.dockerfile
  38. 1 1
      frameworks/Go/revel/revel-fast.dockerfile
  39. 1 1
      frameworks/Go/revel/revel-jet.dockerfile
  40. 1 1
      frameworks/Go/revel/revel-qbs.dockerfile
  41. 1 1
      frameworks/Go/revel/revel-raw.dockerfile
  42. 1 1
      frameworks/Go/revel/revel.dockerfile
  43. 1 1
      frameworks/Go/webgo/webgo.dockerfile

+ 1 - 1
frameworks/Go/aah/aah-mysql.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 RUN apt-get update -yqq
 

+ 1 - 1
frameworks/Go/aah/aah-postgresql.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 RUN apt-get update -yqq
 

+ 1 - 1
frameworks/Go/aah/aah.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 RUN apt-get update -yqq
 

+ 1 - 1
frameworks/Go/beego/beego-orm-mysql.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /beego
 WORKDIR /beego

+ 1 - 1
frameworks/Go/beego/beego.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /beego
 WORKDIR /beego

+ 24 - 30
frameworks/Go/chi/benchmark_config.json

@@ -11,8 +11,8 @@
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "Postgres",
-      "framework": "Chi",
+      "database": "MySQL",
+      "framework": "chi",
       "language": "Go",
       "flavor": "None",
       "orm": "Raw",
@@ -20,10 +20,9 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "Chi",
+      "display_name": "chi",
       "notes": "",
-      "versus": "go",
-      "tags": ["broken"]
+      "versus": "go"
     },
     "prefork": {
       "json_url": "/json",
@@ -35,8 +34,8 @@
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "Postgres",
-      "framework": "Chi",
+      "database": "MySQL",
+      "framework": "chi",
       "language": "Go",
       "flavor": "None",
       "orm": "Raw",
@@ -44,10 +43,9 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "Chi-prefork",
+      "display_name": "chi-prefork",
       "notes": "",
-      "versus": "go",
-      "tags": ["broken"]
+      "versus": "go"
     },
     "gojay": {
       "json_url": "/json",
@@ -59,8 +57,8 @@
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "Postgres",
-      "framework": "Chi",
+      "database": "MySQL",
+      "framework": "chi",
       "language": "Go",
       "flavor": "None",
       "orm": "Raw",
@@ -68,10 +66,9 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "Chi-gojay",
+      "display_name": "chi-gojay",
       "notes": "",
-      "versus": "go",
-      "tags": ["broken"]
+      "versus": "go"
     },
     "gojay-prefork": {
       "json_url": "/json",
@@ -83,8 +80,8 @@
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "Postgres",
-      "framework": "Chi",
+      "database": "MySQL",
+      "framework": "chi",
       "language": "Go",
       "flavor": "None",
       "orm": "Raw",
@@ -92,10 +89,9 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "Chi-gojay-prefork",
+      "display_name": "chi-gojay-prefork",
       "notes": "",
-      "versus": "go",
-      "tags": ["broken"]
+      "versus": "go"
     },
     "sjson": {
       "json_url": "/json",
@@ -107,8 +103,8 @@
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "Postgres",
-      "framework": "Chi",
+      "database": "MySQL",
+      "framework": "chi",
       "language": "Go",
       "flavor": "None",
       "orm": "Raw",
@@ -116,10 +112,9 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "Chi-sjson",
+      "display_name": "chi-sjson",
       "notes": "",
-      "versus": "go",
-      "tags": ["broken"]
+      "versus": "go"
     },
     "sjson-prefork": {
       "json_url": "/json",
@@ -131,8 +126,8 @@
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "Postgres",
-      "framework": "Chi",
+      "database": "MySQL",
+      "framework": "chi",
       "language": "Go",
       "flavor": "None",
       "orm": "Raw",
@@ -140,10 +135,9 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "Chi-sjson-prefork",
+      "display_name": "chi-sjson-prefork",
       "notes": "",
-      "versus": "go",
-      "tags": ["broken"]
+      "versus": "go"
     }
   }]
 }

+ 2 - 2
frameworks/Go/chi/chi-gojay-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /chi
 WORKDIR /chi
@@ -8,7 +8,7 @@ ENV GOPATH /chi
 ENV PATH ${GOPATH}/bin:${PATH}
 
 RUN go get github.com/francoispqt/gojay
-RUN go get github.com/jackc/pgx
+RUN go get github.com/go-sql-driver/mysql
 RUN go get github.com/go-chi/chi
 
 RUN go build -o server src/chi-gojay/*.go

+ 2 - 2
frameworks/Go/chi/chi-gojay.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /chi
 WORKDIR /chi
@@ -8,7 +8,7 @@ ENV GOPATH /chi
 ENV PATH ${GOPATH}/bin:${PATH}
 
 RUN go get github.com/francoispqt/gojay
-RUN go get github.com/jackc/pgx
+RUN go get github.com/go-sql-driver/mysql
 RUN go get github.com/go-chi/chi
 
 RUN go build -o server src/chi-gojay/*.go

+ 2 - 2
frameworks/Go/chi/chi-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /chi
 WORKDIR /chi
@@ -8,7 +8,7 @@ ENV GOPATH /chi
 ENV PATH ${GOPATH}/bin:${PATH}
 
 RUN go get github.com/mailru/easyjson/...
-RUN go get github.com/jackc/pgx
+RUN go get github.com/go-sql-driver/mysql
 RUN go get github.com/go-chi/chi
 
 RUN go build -o server src/chi/*.go

+ 2 - 2
frameworks/Go/chi/chi-sjson-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /chi
 WORKDIR /chi
@@ -8,7 +8,7 @@ ENV GOPATH /chi
 ENV PATH ${GOPATH}/bin:${PATH}
 
 RUN go get github.com/tidwall/sjson
-RUN go get github.com/jackc/pgx
+RUN go get github.com/go-sql-driver/mysql
 RUN go get github.com/go-chi/chi
 
 RUN go build -o server src/chi-sjson/*.go

+ 2 - 2
frameworks/Go/chi/chi-sjson.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /chi
 WORKDIR /chi
@@ -8,7 +8,7 @@ ENV GOPATH /chi
 ENV PATH ${GOPATH}/bin:${PATH}
 
 RUN go get github.com/tidwall/sjson
-RUN go get github.com/jackc/pgx
+RUN go get github.com/go-sql-driver/mysql
 RUN go get github.com/go-chi/chi
 
 RUN go build -o server src/chi-sjson/*.go

+ 1 - 1
frameworks/Go/chi/chi.dockerfile

@@ -8,7 +8,7 @@ ENV GOPATH /chi
 ENV PATH ${GOPATH}/bin:${PATH}
 
 RUN go get github.com/mailru/easyjson/...
-RUN go get github.com/jackc/pgx
+RUN go get github.com/go-sql-driver/mysql
 RUN go get github.com/go-chi/chi
 
 RUN go build -o server src/chi/*.go

+ 27 - 22
frameworks/Go/chi/src/chi-gojay/db.go

@@ -1,47 +1,52 @@
 package main
 
 import (
-	"flag"
+	"fmt"
 	"log"
+	"runtime"
 
-	"github.com/jackc/pgx"
+	"database/sql"
+
+	_ "github.com/go-sql-driver/mysql"
+)
+
+const (
+	// 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
 )
 
 var (
-	defaultDB *pgx.ConnPool
+	// Database
+	worldStatement   *sql.Stmt
+	fortuneStatement *sql.Stmt
+	updateStatement  *sql.Stmt
 )
 
-func initDBConnection(pgURL string) {
-	config, err := pgx.ParseConnectionString(pgURL)
-	if err != nil {
-		flag.PrintDefaults()
-		log.Fatalf("Error parsing db URL: %v", err)
-	}
+func init() {
+	runtime.GOMAXPROCS(runtime.NumCPU())
 
-	connPoolConfig := pgx.ConnPoolConfig{
-		ConnConfig:     config,
-		MaxConnections: maxConnectionCount,
-	}
+	dsn := "benchmarkdbuser:benchmarkdbpass@tcp(%s:3306)/hello_world"
+	dbhost := "tfb-database"
 
-	defaultDB, err = pgx.NewConnPool(connPoolConfig)
+	db, err := sql.Open("mysql", fmt.Sprintf(dsn, dbhost))
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatalf("Error opening database: %v", err)
 	}
-
-	_, err = defaultDB.Prepare("worldSelect", worldSelect)
+	db.SetMaxIdleConns(maxConnectionCount)
+	worldStatement, err = db.Prepare(worldSelect)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
-	_, err = defaultDB.Prepare("fortuneSelect", fortuneSelect)
+	fortuneStatement, err = db.Prepare(fortuneSelect)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
-	_, err = defaultDB.Prepare("worldUpdate", worldUpdate)
+	updateStatement, err = db.Prepare(worldUpdate)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
 }

+ 42 - 90
frameworks/Go/chi/src/chi-gojay/server.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"encoding/json"
 	"flag"
 	"fmt"
 	"html"
@@ -14,9 +15,7 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/francoispqt/gojay"
 	"github.com/go-chi/chi"
-	"github.com/jackc/pgx"
 )
 
 const (
@@ -29,23 +28,15 @@ const (
 )
 
 const (
-	// Database
-	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
-	maxConnectionCount = 256
-
 	helloWorldString    = "Hello, World!"
 	extraFortuneMessage = "Additional fortune added at request time."
 )
 
 var (
-	connectionString = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?sslmode=disable"
-	bindHost         = ":8080"
-	debugFlag        = false
-	preforkFlag      = false
-	childFlag        = false
+	bindHost    = ":8080"
+	debugFlag   = false
+	preforkFlag = false
+	childFlag   = false
 
 	helloWorldMessage = &Message{helloWorldString}
 	extraFortune      = &Fortune{Message: extraFortuneMessage}
@@ -53,17 +44,7 @@ var (
 
 // Message is a JSON struct to render a message
 type Message struct {
-	Message string
-}
-
-// MarshalJSONObject encodes the message as JSON
-func (m *Message) MarshalJSONObject(dec *gojay.Encoder) {
-	dec.AddStringKey("message", m.Message)
-}
-
-// IsNil returns true if the object is nil
-func (m *Message) IsNil() bool {
-	return m == nil
+	Message string `json:"message"`
 }
 
 // World is a JSON struct to render a random number
@@ -72,36 +53,6 @@ type World struct {
 	RandomNumber uint16 `json:"randomNumber"`
 }
 
-// Worlds is a list of World
-type Worlds []World
-
-// MarshalJSONArray marshals the list of worlds
-func (ws Worlds) MarshalJSONArray(enc *gojay.Encoder) {
-	for _, w := range ws {
-		enc.AddObject(&w)
-	}
-}
-
-// IsNil returns true if the object is nil
-func (ws Worlds) IsNil() bool {
-	return ws == nil
-}
-
-// MarshalJSONObject encodes the message as JSON
-func (w *World) MarshalJSONObject(dec *gojay.Encoder) {
-	dec.AddIntKey("id", int(w.ID))
-	dec.AddIntKey("randomNumber", int(w.RandomNumber))
-}
-
-// IsNil returns true if the object is nil
-func (w *World) IsNil() bool {
-	return w == nil
-}
-
-func randomRow() *pgx.Row {
-	return defaultDB.QueryRow("worldSelect", rand.Intn(worldRowCount)+1)
-}
-
 // Fortune renders a fortune in JSON
 type Fortune struct {
 	ID      uint16 `json:"id"`
@@ -121,28 +72,31 @@ func (s Fortunes) Swap(i, j int) {
 	s[i], s[j] = s[j], s[i]
 }
 
+func (s Fortunes) Less(i, j int) bool { return s[i].Message < s[j].Message }
+
 // Sets the content type of response. Also adds the Server header.
 func setContentType(w http.ResponseWriter, contentType string) {
-	w.Header().Set("Server", "Chi")
+	w.Header().Set("Server", "chi")
 	w.Header().Set("Content-Type", contentType)
 }
 
 // Test 1: JSON Serialization
 func serializeJSON(w http.ResponseWriter, r *http.Request) {
 	setContentType(w, "application/json")
-
-	_ = gojay.NewEncoder(w).Encode(helloWorldMessage)
+	_ = json.NewEncoder(w).Encode(helloWorldMessage)
 }
 
 // Test 2: Single Database Query
 func singleQuery(w http.ResponseWriter, r *http.Request) {
-	world := World{}
-	if err := randomRow().Scan(&world.ID, &world.RandomNumber); err != nil {
-		log.Printf("Error scanning world row: %s", err.Error())
+	var world World
+	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.ID, &world.RandomNumber)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 
 	setContentType(w, "application/json")
-	_ = gojay.NewEncoder(w).Encode(&world)
+	_ = json.NewEncoder(w).Encode(&world)
 }
 
 // Caps queries parameter between 1 and 500.
@@ -164,40 +118,41 @@ func sanitizeQueryParam(queries string) int {
 // Test 3: Multiple Database Queries
 func multipleQueries(w http.ResponseWriter, r *http.Request) {
 	queries := sanitizeQueryParam(r.URL.Query().Get("queries"))
-	worlds := make(Worlds, queries)
+	worlds := make([]World, queries)
 
 	for i := 0; i < queries; i++ {
-		if err := randomRow().Scan(&worlds[i].ID, &worlds[i].RandomNumber); err != nil {
-			log.Printf("Error scanning world row: %s", err.Error())
+		err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].ID, &worlds[i].RandomNumber)
+		if err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 	}
 
 	setContentType(w, "application/json")
-	_ = gojay.NewEncoder(w).EncodeArray(worlds)
+	_ = json.NewEncoder(w).Encode(worlds)
 }
 
 // Test 4: Fortunes
 func fortunes(w http.ResponseWriter, r *http.Request) {
-	rows, err := defaultDB.Query("fortuneSelect")
+	rows, err := fortuneStatement.Query()
 	if err != nil {
-		log.Printf("Error preparing statement: %v", err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 
-	fortunes := make(Fortunes, 0, 256)
-
-	for rows.Next() {
+	fortunes := make(Fortunes, 0, 16)
+	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {
-			log.Printf("Error scanning fortune row: %s", err.Error())
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 		fortunes = append(fortunes, &fortune)
 	}
-	rows.Close()
-	fortunes = append(fortunes, extraFortune)
+	fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."})
+
+	sort.Sort(fortunes)
 
-	sort.Slice(fortunes, func(i, j int) bool {
-		return fortunes[i].Message < fortunes[j].Message
-	})
 	setContentType(w, "text/html; charset=utf-8")
 
 	var body strings.Builder
@@ -210,22 +165,22 @@ func fortunes(w http.ResponseWriter, r *http.Request) {
 
 // Test 5: Database Updates
 func dbupdate(w http.ResponseWriter, r *http.Request) {
-	queries := sanitizeQueryParam(r.URL.Query().Get("queries"))
-	worlds := make(Worlds, queries)
-
-	for i := 0; i < queries; i++ {
-		w := &worlds[i]
-		if err := randomRow().Scan(&w.ID, &w.RandomNumber); err != nil {
-			log.Printf("Error scanning world row: %s", err.Error())
+	numQueries := sanitizeQueryParam(r.URL.Query().Get("queries"))
+	worlds := make([]World, numQueries)
+	for i := 0; i < numQueries; i++ {
+		if err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].ID, &worlds[i].RandomNumber); err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 		worlds[i].RandomNumber = uint16(rand.Intn(worldRowCount) + 1)
-		if _, err := defaultDB.Exec("worldUpdate", w.RandomNumber, w.ID); err != nil {
-			log.Printf("Error updating world row: %s", err.Error())
+		if _, err := updateStatement.Exec(worlds[i].RandomNumber, worlds[i].ID); err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 	}
 
 	setContentType(w, "application/json")
-	_ = gojay.NewEncoder(w).EncodeArray(worlds)
+	_ = json.NewEncoder(w).Encode(worlds)
 }
 
 // Test 6: Plaintext
@@ -236,7 +191,6 @@ func plaintext(w http.ResponseWriter, r *http.Request) {
 
 func init() {
 	flag.StringVar(&bindHost, "bind", bindHost, "Set bind host")
-	flag.StringVar(&connectionString, "db", connectionString, "Set database URL")
 	flag.BoolVar(&debugFlag, "debug", false, "Enable debug mode")
 	flag.BoolVar(&preforkFlag, "prefork", false, "Enable prefork mode")
 	flag.BoolVar(&childFlag, "child", false, "Enable child mode")
@@ -273,8 +227,6 @@ func main() {
 		listener = doPrefork(childFlag, bindHost)
 	}
 
-	initDBConnection(connectionString)
-
 	if !debugFlag {
 		log.SetOutput(ioutil.Discard)
 	}

+ 27 - 22
frameworks/Go/chi/src/chi-sjson/db.go

@@ -1,47 +1,52 @@
 package main
 
 import (
-	"flag"
+	"fmt"
 	"log"
+	"runtime"
 
-	"github.com/jackc/pgx"
+	"database/sql"
+
+	_ "github.com/go-sql-driver/mysql"
+)
+
+const (
+	// 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
 )
 
 var (
-	defaultDB *pgx.ConnPool
+	// Database
+	worldStatement   *sql.Stmt
+	fortuneStatement *sql.Stmt
+	updateStatement  *sql.Stmt
 )
 
-func initDBConnection(pgURL string) {
-	config, err := pgx.ParseConnectionString(pgURL)
-	if err != nil {
-		flag.PrintDefaults()
-		log.Fatalf("Error parsing db URL: %v", err)
-	}
+func init() {
+	runtime.GOMAXPROCS(runtime.NumCPU())
 
-	connPoolConfig := pgx.ConnPoolConfig{
-		ConnConfig:     config,
-		MaxConnections: maxConnectionCount,
-	}
+	dsn := "benchmarkdbuser:benchmarkdbpass@tcp(%s:3306)/hello_world"
+	dbhost := "tfb-database"
 
-	defaultDB, err = pgx.NewConnPool(connPoolConfig)
+	db, err := sql.Open("mysql", fmt.Sprintf(dsn, dbhost))
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatalf("Error opening database: %v", err)
 	}
-
-	_, err = defaultDB.Prepare("worldSelect", worldSelect)
+	db.SetMaxIdleConns(maxConnectionCount)
+	worldStatement, err = db.Prepare(worldSelect)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
-	_, err = defaultDB.Prepare("fortuneSelect", fortuneSelect)
+	fortuneStatement, err = db.Prepare(fortuneSelect)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
-	_, err = defaultDB.Prepare("worldUpdate", worldUpdate)
+	updateStatement, err = db.Prepare(worldUpdate)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
 }

+ 42 - 91
frameworks/Go/chi/src/chi-sjson/server.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"encoding/json"
 	"flag"
 	"fmt"
 	"html"
@@ -15,8 +16,6 @@ import (
 	"strings"
 
 	"github.com/go-chi/chi"
-	"github.com/jackc/pgx"
-	"github.com/tidwall/sjson"
 )
 
 const (
@@ -29,44 +28,23 @@ const (
 )
 
 const (
-	// Database
-	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
-	maxConnectionCount = 256
-
 	helloWorldString    = "Hello, World!"
 	extraFortuneMessage = "Additional fortune added at request time."
 )
 
 var (
-	connectionString = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?sslmode=disable"
-	bindHost         = ":8080"
-	debugFlag        = false
-	preforkFlag      = false
-	childFlag        = false
+	bindHost    = ":8080"
+	debugFlag   = false
+	preforkFlag = false
+	childFlag   = false
 
 	helloWorldMessage = &Message{helloWorldString}
 	extraFortune      = &Fortune{Message: extraFortuneMessage}
 )
 
-// sjson
-var (
-	messageJSONTmpl = []byte(`{"message": ""}`)
-	worldJSONTmpl   = []byte(`{"id": 0, "randomNumber": 0}`)
-	optimistic      = &sjson.Options{Optimistic: true}
-	inPlace         = &sjson.Options{Optimistic: true, ReplaceInPlace: true}
-)
-
 // Message is a JSON struct to render a message
 type Message struct {
-	Message string
-}
-
-// MarshalJSON marshals the object as json
-func (m Message) MarshalJSON() ([]byte, error) {
-	return sjson.SetBytesOptions(messageJSONTmpl, "message", m.Message, optimistic)
+	Message string `json:"message"`
 }
 
 // World is a JSON struct to render a random number
@@ -75,30 +53,6 @@ type World struct {
 	RandomNumber uint16 `json:"randomNumber"`
 }
 
-// MarshalJSON marshals the object as json
-func (w World) MarshalJSON() ([]byte, error) {
-	data, _ := sjson.SetBytesOptions(worldJSONTmpl, "id", w.ID, optimistic)
-	return sjson.SetBytesOptions(data, "randomNumber", w.RandomNumber, inPlace)
-}
-
-// Worlds is a list of worlds
-type Worlds []World
-
-// MarshalJSON marshals the object as json
-func (ws Worlds) MarshalJSON() ([]byte, error) {
-	jsonResult := []byte(`[]`)
-
-	for _, w := range ws {
-		jsonResult, _ = sjson.SetBytesOptions(jsonResult, "-1", &w, inPlace)
-	}
-
-	return jsonResult, nil
-}
-
-func randomRow() *pgx.Row {
-	return defaultDB.QueryRow("worldSelect", rand.Intn(worldRowCount)+1)
-}
-
 // Fortune renders a fortune in JSON
 type Fortune struct {
 	ID      uint16 `json:"id"`
@@ -118,30 +72,31 @@ func (s Fortunes) Swap(i, j int) {
 	s[i], s[j] = s[j], s[i]
 }
 
+func (s Fortunes) Less(i, j int) bool { return s[i].Message < s[j].Message }
+
 // Sets the content type of response. Also adds the Server header.
 func setContentType(w http.ResponseWriter, contentType string) {
-	w.Header().Set("Server", "Chi")
+	w.Header().Set("Server", "chi")
 	w.Header().Set("Content-Type", contentType)
 }
 
 // Test 1: JSON Serialization
 func serializeJSON(w http.ResponseWriter, r *http.Request) {
 	setContentType(w, "application/json")
-
-	data, _ := helloWorldMessage.MarshalJSON()
-	_, _ = w.Write(data)
+	_ = json.NewEncoder(w).Encode(helloWorldMessage)
 }
 
 // Test 2: Single Database Query
 func singleQuery(w http.ResponseWriter, r *http.Request) {
-	world := World{}
-	if err := randomRow().Scan(&world.ID, &world.RandomNumber); err != nil {
-		log.Printf("Error scanning world row: %s", err.Error())
+	var world World
+	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.ID, &world.RandomNumber)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 
 	setContentType(w, "application/json")
-	data, _ := world.MarshalJSON()
-	_, _ = w.Write(data)
+	_ = json.NewEncoder(w).Encode(&world)
 }
 
 // Caps queries parameter between 1 and 500.
@@ -163,41 +118,41 @@ func sanitizeQueryParam(queries string) int {
 // Test 3: Multiple Database Queries
 func multipleQueries(w http.ResponseWriter, r *http.Request) {
 	queries := sanitizeQueryParam(r.URL.Query().Get("queries"))
-	worlds := make(Worlds, queries)
+	worlds := make([]World, queries)
 
 	for i := 0; i < queries; i++ {
-		if err := randomRow().Scan(&worlds[i].ID, &worlds[i].RandomNumber); err != nil {
-			log.Printf("Error scanning world row: %s", err.Error())
+		err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].ID, &worlds[i].RandomNumber)
+		if err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 	}
 
 	setContentType(w, "application/json")
-	data, _ := worlds.MarshalJSON()
-	_, _ = w.Write(data)
+	_ = json.NewEncoder(w).Encode(worlds)
 }
 
 // Test 4: Fortunes
 func fortunes(w http.ResponseWriter, r *http.Request) {
-	rows, err := defaultDB.Query("fortuneSelect")
+	rows, err := fortuneStatement.Query()
 	if err != nil {
-		log.Printf("Error preparing statement: %v", err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 
-	fortunes := make(Fortunes, 0, 256)
-
-	for rows.Next() {
+	fortunes := make(Fortunes, 0, 16)
+	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {
-			log.Printf("Error scanning fortune row: %s", err.Error())
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 		fortunes = append(fortunes, &fortune)
 	}
-	rows.Close()
-	fortunes = append(fortunes, extraFortune)
+	fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."})
+
+	sort.Sort(fortunes)
 
-	sort.Slice(fortunes, func(i, j int) bool {
-		return fortunes[i].Message < fortunes[j].Message
-	})
 	setContentType(w, "text/html; charset=utf-8")
 
 	var body strings.Builder
@@ -210,23 +165,22 @@ func fortunes(w http.ResponseWriter, r *http.Request) {
 
 // Test 5: Database Updates
 func dbupdate(w http.ResponseWriter, r *http.Request) {
-	queries := sanitizeQueryParam(r.URL.Query().Get("queries"))
-	worlds := make(Worlds, queries)
-
-	for i := 0; i < queries; i++ {
-		w := &worlds[i]
-		if err := randomRow().Scan(&w.ID, &w.RandomNumber); err != nil {
-			log.Printf("Error scanning world row: %s", err.Error())
+	numQueries := sanitizeQueryParam(r.URL.Query().Get("queries"))
+	worlds := make([]World, numQueries)
+	for i := 0; i < numQueries; i++ {
+		if err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].ID, &worlds[i].RandomNumber); err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 		worlds[i].RandomNumber = uint16(rand.Intn(worldRowCount) + 1)
-		if _, err := defaultDB.Exec("worldUpdate", w.RandomNumber, w.ID); err != nil {
-			log.Printf("Error updating world row: %s", err.Error())
+		if _, err := updateStatement.Exec(worlds[i].RandomNumber, worlds[i].ID); err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 	}
 
 	setContentType(w, "application/json")
-	data, _ := worlds.MarshalJSON()
-	_, _ = w.Write(data)
+	_ = json.NewEncoder(w).Encode(worlds)
 }
 
 // Test 6: Plaintext
@@ -237,7 +191,6 @@ func plaintext(w http.ResponseWriter, r *http.Request) {
 
 func init() {
 	flag.StringVar(&bindHost, "bind", bindHost, "Set bind host")
-	flag.StringVar(&connectionString, "db", connectionString, "Set database URL")
 	flag.BoolVar(&debugFlag, "debug", false, "Enable debug mode")
 	flag.BoolVar(&preforkFlag, "prefork", false, "Enable prefork mode")
 	flag.BoolVar(&childFlag, "child", false, "Enable child mode")
@@ -274,8 +227,6 @@ func main() {
 		listener = doPrefork(childFlag, bindHost)
 	}
 
-	initDBConnection(connectionString)
-
 	if !debugFlag {
 		log.SetOutput(ioutil.Discard)
 	}

+ 27 - 22
frameworks/Go/chi/src/chi/db.go

@@ -1,47 +1,52 @@
 package main
 
 import (
-	"flag"
+	"fmt"
 	"log"
+	"runtime"
 
-	"github.com/jackc/pgx"
+	"database/sql"
+
+	_ "github.com/go-sql-driver/mysql"
+)
+
+const (
+	// 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
 )
 
 var (
-	defaultDB *pgx.ConnPool
+	// Database
+	worldStatement   *sql.Stmt
+	fortuneStatement *sql.Stmt
+	updateStatement  *sql.Stmt
 )
 
-func initDBConnection(pgURL string) {
-	config, err := pgx.ParseConnectionString(pgURL)
-	if err != nil {
-		flag.PrintDefaults()
-		log.Fatalf("Error parsing db URL: %v", err)
-	}
+func init() {
+	runtime.GOMAXPROCS(runtime.NumCPU())
 
-	connPoolConfig := pgx.ConnPoolConfig{
-		ConnConfig:     config,
-		MaxConnections: maxConnectionCount,
-	}
+	dsn := "benchmarkdbuser:benchmarkdbpass@tcp(%s:3306)/hello_world"
+	dbhost := "tfb-database"
 
-	defaultDB, err = pgx.NewConnPool(connPoolConfig)
+	db, err := sql.Open("mysql", fmt.Sprintf(dsn, dbhost))
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatalf("Error opening database: %v", err)
 	}
-
-	_, err = defaultDB.Prepare("worldSelect", worldSelect)
+	db.SetMaxIdleConns(maxConnectionCount)
+	worldStatement, err = db.Prepare(worldSelect)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
-	_, err = defaultDB.Prepare("fortuneSelect", fortuneSelect)
+	fortuneStatement, err = db.Prepare(fortuneSelect)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
-	_, err = defaultDB.Prepare("worldUpdate", worldUpdate)
+	updateStatement, err = db.Prepare(worldUpdate)
 	if err != nil {
-		flag.PrintDefaults()
 		log.Fatal(err)
 	}
 }

+ 35 - 46
frameworks/Go/chi/src/chi/server.go

@@ -16,7 +16,6 @@ import (
 	"strings"
 
 	"github.com/go-chi/chi"
-	"github.com/jackc/pgx"
 )
 
 const (
@@ -29,23 +28,15 @@ const (
 )
 
 const (
-	// Database
-	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
-	maxConnectionCount = 256
-
 	helloWorldString    = "Hello, World!"
 	extraFortuneMessage = "Additional fortune added at request time."
 )
 
 var (
-	connectionString = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?sslmode=disable"
-	bindHost         = ":8080"
-	debugFlag        = false
-	preforkFlag      = false
-	childFlag        = false
+	bindHost    = ":8080"
+	debugFlag   = false
+	preforkFlag = false
+	childFlag   = false
 
 	helloWorldMessage = &Message{helloWorldString}
 	extraFortune      = &Fortune{Message: extraFortuneMessage}
@@ -62,10 +53,6 @@ type World struct {
 	RandomNumber uint16 `json:"randomNumber"`
 }
 
-func randomRow() *pgx.Row {
-	return defaultDB.QueryRow("worldSelect", rand.Intn(worldRowCount)+1)
-}
-
 // Fortune renders a fortune in JSON
 type Fortune struct {
 	ID      uint16 `json:"id"`
@@ -85,9 +72,11 @@ func (s Fortunes) Swap(i, j int) {
 	s[i], s[j] = s[j], s[i]
 }
 
+func (s Fortunes) Less(i, j int) bool { return s[i].Message < s[j].Message }
+
 // Sets the content type of response. Also adds the Server header.
 func setContentType(w http.ResponseWriter, contentType string) {
-	w.Header().Set("Server", "Chi")
+	w.Header().Set("Server", "chi")
 	w.Header().Set("Content-Type", contentType)
 }
 
@@ -99,9 +88,11 @@ func serializeJSON(w http.ResponseWriter, r *http.Request) {
 
 // Test 2: Single Database Query
 func singleQuery(w http.ResponseWriter, r *http.Request) {
-	world := World{}
-	if err := randomRow().Scan(&world.ID, &world.RandomNumber); err != nil {
-		log.Printf("Error scanning world row: %s", err.Error())
+	var world World
+	err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&world.ID, &world.RandomNumber)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 
 	setContentType(w, "application/json")
@@ -130,8 +121,10 @@ func multipleQueries(w http.ResponseWriter, r *http.Request) {
 	worlds := make([]World, queries)
 
 	for i := 0; i < queries; i++ {
-		if err := randomRow().Scan(&worlds[i].ID, &worlds[i].RandomNumber); err != nil {
-			log.Printf("Error scanning world row: %s", err.Error())
+		err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].ID, &worlds[i].RandomNumber)
+		if err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 	}
 
@@ -141,26 +134,25 @@ func multipleQueries(w http.ResponseWriter, r *http.Request) {
 
 // Test 4: Fortunes
 func fortunes(w http.ResponseWriter, r *http.Request) {
-	rows, err := defaultDB.Query("fortuneSelect")
+	rows, err := fortuneStatement.Query()
 	if err != nil {
-		log.Printf("Error preparing statement: %v", err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 
-	fortunes := make(Fortunes, 0, 256)
-
-	for rows.Next() {
+	fortunes := make(Fortunes, 0, 16)
+	for rows.Next() { //Fetch rows
 		fortune := Fortune{}
 		if err := rows.Scan(&fortune.ID, &fortune.Message); err != nil {
-			log.Printf("Error scanning fortune row: %s", err.Error())
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 		fortunes = append(fortunes, &fortune)
 	}
-	rows.Close()
-	fortunes = append(fortunes, extraFortune)
+	fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."})
+
+	sort.Sort(fortunes)
 
-	sort.Slice(fortunes, func(i, j int) bool {
-		return fortunes[i].Message < fortunes[j].Message
-	})
 	setContentType(w, "text/html; charset=utf-8")
 
 	var body strings.Builder
@@ -173,17 +165,17 @@ func fortunes(w http.ResponseWriter, r *http.Request) {
 
 // Test 5: Database Updates
 func dbupdate(w http.ResponseWriter, r *http.Request) {
-	queries := sanitizeQueryParam(r.URL.Query().Get("queries"))
-	worlds := make([]World, queries)
-
-	for i := 0; i < queries; i++ {
-		w := &worlds[i]
-		if err := randomRow().Scan(&w.ID, &w.RandomNumber); err != nil {
-			log.Printf("Error scanning world row: %s", err.Error())
+	numQueries := sanitizeQueryParam(r.URL.Query().Get("queries"))
+	worlds := make([]World, numQueries)
+	for i := 0; i < numQueries; i++ {
+		if err := worldStatement.QueryRow(rand.Intn(worldRowCount)+1).Scan(&worlds[i].ID, &worlds[i].RandomNumber); err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 		worlds[i].RandomNumber = uint16(rand.Intn(worldRowCount) + 1)
-		if _, err := defaultDB.Exec("worldUpdate", w.RandomNumber, w.ID); err != nil {
-			log.Printf("Error updating world row: %s", err.Error())
+		if _, err := updateStatement.Exec(worlds[i].RandomNumber, worlds[i].ID); err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
 		}
 	}
 
@@ -199,7 +191,6 @@ func plaintext(w http.ResponseWriter, r *http.Request) {
 
 func init() {
 	flag.StringVar(&bindHost, "bind", bindHost, "Set bind host")
-	flag.StringVar(&connectionString, "db", connectionString, "Set database URL")
 	flag.BoolVar(&debugFlag, "debug", false, "Enable debug mode")
 	flag.BoolVar(&preforkFlag, "prefork", false, "Enable prefork mode")
 	flag.BoolVar(&childFlag, "child", false, "Enable child mode")
@@ -236,8 +227,6 @@ func main() {
 		listener = doPrefork(childFlag, bindHost)
 	}
 
-	initDBConnection(connectionString)
-
 	if !debugFlag {
 		log.SetOutput(ioutil.Discard)
 	}

+ 1 - 1
frameworks/Go/echo/echo.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /echo
 WORKDIR /echo

+ 1 - 1
frameworks/Go/falcore/falcore.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /falcore
 WORKDIR /falcore

+ 1 - 1
frameworks/Go/fiber/fiber-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.13
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /fiber

+ 1 - 1
frameworks/Go/fiber/fiber.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.13
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /fiber

+ 1 - 1
frameworks/Go/gin/gin.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /gin
 WORKDIR /gin

+ 1 - 1
frameworks/Go/go-std/go-mgo-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-mgo.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-my-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-my.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-pgx-easyjson.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-pgx-prefork.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go-pgx.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/go-std/go.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ENV GO111MODULE on
 WORKDIR /go-std

+ 1 - 1
frameworks/Go/goji/goji.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.12
+FROM golang:1.14
 
 ADD ./ /goji
 WORKDIR /goji

+ 1 - 1
frameworks/Go/kami/kami.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /kami
 WORKDIR /kami

+ 1 - 1
frameworks/Go/martini/martini.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.11.1
+FROM golang:1.14
 
 WORKDIR /home
 COPY . .

+ 1 - 1
frameworks/Go/revel/revel-fast.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /revel
 WORKDIR /revel

+ 1 - 1
frameworks/Go/revel/revel-jet.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /revel
 WORKDIR /revel

+ 1 - 1
frameworks/Go/revel/revel-qbs.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /revel
 WORKDIR /revel

+ 1 - 1
frameworks/Go/revel/revel-raw.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /revel
 WORKDIR /revel

+ 1 - 1
frameworks/Go/revel/revel.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /revel
 WORKDIR /revel

+ 1 - 1
frameworks/Go/webgo/webgo.dockerfile

@@ -1,4 +1,4 @@
-FROM golang:1.10.1
+FROM golang:1.14
 
 ADD ./ /webgo
 WORKDIR /webgo