Skip to main content

Quick Start



To install Echo Go 1.13 or higher is required. Go 1.12 has limited support and some middlewares will not be available. Make sure your project folder is outside your $GOPATH.

$ mkdir myapp && cd myapp
$ go mod init myapp
$ go get

If you are working with Go v1.14 or earlier use:

$ GO111MODULE=on go get

Hello, World!

Create server.go

package main

import (


func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")

Start server

$ go run server.go

Browse to http://localhost:1323 and you should see Hello, World! on the page.


e.POST("/users", saveUser)
e.GET("/users/:id", getUser)
e.PUT("/users/:id", updateUser)
e.DELETE("/users/:id", deleteUser)

Path Parameters

// e.GET("/users/:id", getUser)
func getUser(c echo.Context) error {
// User ID from path `users/:id`
id := c.Param("id")
return c.String(http.StatusOK, id)

Browse to http://localhost:1323/users/joe and you should see 'joe' on the page.

Query Parameters


//e.GET("/show", show)
func show(c echo.Context) error {
// Get team and member from the query string
team := c.QueryParam("team")
member := c.QueryParam("member")
return c.String(http.StatusOK, "team:" + team + ", member:" + member)

Browse to http://localhost:1323/show?team=x-men&member=wolverine and you should see 'team:x-men, member:wolverine' on the page.

Form application/x-www-form-urlencoded

POST /save

nameJoe Smith
email[email protected]
// e.POST("/save", save)
func save(c echo.Context) error {
// Get name and email
name := c.FormValue("name")
email := c.FormValue("email")
return c.String(http.StatusOK, "name:" + name + ", email:" + email)

Run the following command:

$ curl -d "name=Joe Smith" -d "[email protected]" http://localhost:1323/save
// => name:Joe Smith, email:[email protected]

Form multipart/form-data

POST /save

nameJoe Smith
func save(c echo.Context) error {
// Get name
name := c.FormValue("name")
// Get avatar
avatar, err := c.FormFile("avatar")
if err != nil {
return err

// Source
src, err := avatar.Open()
if err != nil {
return err
defer src.Close()

// Destination
dst, err := os.Create(avatar.Filename)
if err != nil {
return err
defer dst.Close()

// Copy
if _, err = io.Copy(dst, src); err != nil {
return err

return c.HTML(http.StatusOK, "<b>Thank you! " + name + "</b>")

Run the following command.

$ curl -F "name=Joe Smith" -F "avatar=@/path/to/your/avatar.png" http://localhost:1323/save
// => <b>Thank you! Joe Smith</b>

For checking uploaded image, run the following command.

cd <project directory>
ls avatar.png
// => avatar.png

Handling Request

  • Bind json, xml, form or query payload into Go struct based on Content-Type request header.
  • Render response as json or xml with status code.
type User struct {
Name string `json:"name" xml:"name" form:"name" query:"name"`
Email string `json:"email" xml:"email" form:"email" query:"email"`

e.POST("/users", func(c echo.Context) error {
u := new(User)
if err := c.Bind(u); err != nil {
return err
return c.JSON(http.StatusCreated, u)
// or
// return c.XML(http.StatusCreated, u)

Static Content

Serve any file from static directory for path /static/*.

e.Static("/static", "static")

Learn More

Template Rendering


// Root level middleware

// Group level middleware
g := e.Group("/admin")
g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
if username == "joe" && password == "secret" {
return true, nil
return false, nil

// Route level middleware
track := func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
println("request to /users")
return next(c)
e.GET("/users", func(c echo.Context) error {
return c.String(http.StatusOK, "/users")
}, track)