Client code usually branches on a response status before reading the body.

status code HTTP status codes group results into success, client error, server error, and other categories.

Response Status

statusCode
response_status.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

type responseMeta struct {
	StatusCode int
	Status     string
}

func main() {
	var statusCode = 200
	text := "OK"
	if statusCode == 404 {
		text = "Not Found"
	}
	if statusCode == 503 {
		text = "Service Unavailable"
	}
	response := responseMeta{
		StatusCode: statusCode,
		Status:     fmt.Sprintf("%d %s", statusCode, text),
	}

	group := "other"
	if response.StatusCode >= 200 && response.StatusCode < 300 {
		group = "success"
	}
	if response.StatusCode >= 400 && response.StatusCode < 500 {
		group = "client error"
	}
	if response.StatusCode >= 500 {
		group = "server error"
	}

	fmt.Println("status=", response.Status)
	fmt.Println("code=", response.StatusCode)
	fmt.Println("group=", group)
}
package main

import "fmt"

type responseMeta struct {
	StatusCode int
	Status     string
}

func main() {
	var statusCode = 404
	text := "OK"
	if statusCode == 404 {
		text = "Not Found"
	}
	if statusCode == 503 {
		text = "Service Unavailable"
	}
	response := responseMeta{
		StatusCode: statusCode,
		Status:     fmt.Sprintf("%d %s", statusCode, text),
	}

	group := "other"
	if response.StatusCode >= 200 && response.StatusCode < 300 {
		group = "success"
	}
	if response.StatusCode >= 400 && response.StatusCode < 500 {
		group = "client error"
	}
	if response.StatusCode >= 500 {
		group = "server error"
	}

	fmt.Println("status=", response.Status)
	fmt.Println("code=", response.StatusCode)
	fmt.Println("group=", group)
}
package main

import "fmt"

type responseMeta struct {
	StatusCode int
	Status     string
}

func main() {
	var statusCode = 503
	text := "OK"
	if statusCode == 404 {
		text = "Not Found"
	}
	if statusCode == 503 {
		text = "Service Unavailable"
	}
	response := responseMeta{
		StatusCode: statusCode,
		Status:     fmt.Sprintf("%d %s", statusCode, text),
	}

	group := "other"
	if response.StatusCode >= 200 && response.StatusCode < 300 {
		group = "success"
	}
	if response.StatusCode >= 400 && response.StatusCode < 500 {
		group = "client error"
	}
	if response.StatusCode >= 500 {
		group = "server error"
	}

	fmt.Println("status=", response.Status)
	fmt.Println("code=", response.StatusCode)
	fmt.Println("group=", group)
}
  1. statusCode ← 200, text ← "OK", response ← main.responseMeta{StatusCode:200, Status:"200 OK"}

    10func main() {11  var statusCode→ 200 = 200 //@statusCode=404, 50312  text→ "OK" := "OK"13  if statusCode == 404 {14    text = "Not Found"15  }16  if statusCode == 503 {17    text = "Service Unavailable"18  }19  response→ main.responseMeta{StatusCode:200, Status:"200 OK"} := responseMeta{20    StatusCode: statusCode200,21    Status:     fmt.Sprintf("%d %s", statusCode200, text"OK"),22  }2324  group→ "other" := "other"25  if response.StatusCode >= 200 && response.StatusCode < 300 {
  2. group ← "success"

    24group := "other"25if response.StatusCode200 >= 200 && response.StatusCode < 300 {26  group→ "success" = "success"27}
  3. fmt.Println("status=", response.Status)

    35  fmt.Println("status=", response.Status"200 OK")36  fmt.Println("code=", response.StatusCode200)37  fmt.Println("group=", group"success")38}
    outputstatus= 200 OK
    code= 200
    group= success
  1. statusCode ← 404, text ← "OK"

    10func main() {11  var statusCode→ 404 = 40412  text→ "OK" := "OK"13  if statusCode == 404 {
  2. text ← "Not Found"

    12text := "OK"13if statusCode404 == 404 {14  text→ "Not Found" = "Not Found"15}
  3. response ← main.responseMeta{StatusCode:404, Status:"404 Not Found"}

    18}19response→ main.responseMeta{StatusCode:404, Status:"404 Not Found"} := responseMeta{20  StatusCode: statusCode404,21  Status:     fmt.Sprintf("%d %s", statusCode404, text"Not Found"),22}2324group→ "other" := "other"25if response.StatusCode >= 200 && response.StatusCode < 300 {
  4. group ← "client error"

    27}28if response.StatusCode404 >= 400 && response.StatusCode < 500 {29  group→ "client error" = "client error"30}
  5. fmt.Println("status=", response.Status)

    35  fmt.Println("status=", response.Status"404 Not Found")36  fmt.Println("code=", response.StatusCode404)37  fmt.Println("group=", group"client error")38}
    outputstatus= 404 Not Found
    code= 404
    group= client error
  1. statusCode ← 503, text ← "OK"

    10func main() {11  var statusCode→ 503 = 50312  text→ "OK" := "OK"13  if statusCode == 404 {
  2. text ← "Service Unavailable"

    15}16if statusCode503 == 503 {17  text→ "Service Unavailable" = "Service Unavailable"18}
  3. response ← main.responseMeta{StatusCode:503, Status:"503 Service Unavailable"}

    18}19response→ main.responseMeta{StatusCode:503, Status:"503 Service Unavailable"} := responseMeta{20  StatusCode: statusCode503,21  Status:     fmt.Sprintf("%d %s", statusCode503, text"Service Unavailable"),22}2324group→ "other" := "other"25if response.StatusCode >= 200 && response.StatusCode < 300 {
  4. group ← "server error"

    30}31if response.StatusCode503 >= 500 {32  group→ "server error" = "server error"33}
  5. fmt.Println("status=", response.Status)

    35  fmt.Println("status=", response.Status"503 Service Unavailable")36  fmt.Println("code=", response.StatusCode503)37  fmt.Println("group=", group"server error")38}
    outputstatus= 503 Service Unavailable
    code= 503
    group= server error