Server-Side Scripting/Iteration/Go

From Wikiversity
Jump to navigation Jump to search

lesson4.go[edit | edit source]

// Demonstrates conditions, while loops and for loops using
// Celsius and Fahrenheit temperature conversion tables.
//
// References:
//  https://www.mathsisfun.com/temperature-conversion.html
//  https://golang.org/doc/
//  https://golangcode.com/get-a-url-parameter-from-a-request/
//  https://gowebexamples.com/
//  https://tour.golang.org/
//  https://pkg.go.dev/html/template

package routes

import (
    "net/http"
    "html/template"
    "path/filepath"
	"strconv"
)

func Lesson4(response http.ResponseWriter, request *http.Request) {
	response.Header().Set("Content-Type", "text/html; charset=utf-8")

	type Data struct {
		Table  template.HTML
	}
	
	result := ""

    switch request.Method {
        case "GET":
            result = ""
        case "POST":
            start, _ := strconv.Atoi(request.FormValue("start"))
            stop, _ := strconv.Atoi(request.FormValue("stop"))
            increment, _ := strconv.Atoi(request.FormValue("increment"))
            submit := request.FormValue("submit")

            if submit == "Celsius" {
                result = processCelsius(start, stop, increment)
            } else if submit == "Fahrenheit" {
                result = processFahrenheit(start, stop, increment)
            } else {
                result = "Unexpected submit value: " + submit
            }
        default:
            result = "Unexpected request method: " + request.Method
        
    }

	data := Data{template.HTML(result)}
	path := filepath.Join("templates", "lesson4.html")
	parsed, _ := template.ParseFiles(path)
	parsed.Execute(response, data)
}

func processCelsius(start int, stop int, increment int) string {
    result := "<h1>Temperature Conversion</h1>"
    result = result + "<table><tr><th>Celsius</th><th>Fahrenheit</th></tr>"
    celsius := start
    for celsius <= stop {
        fahrenheit := float64(celsius) * 9 / 5 + 32
        result += "<tr><td>" + strconv.Itoa(celsius) + "</td>"
        result += "<td>" + strconv.FormatFloat(fahrenheit, 'f', 1, 64) + "</td></tr>"
        celsius += increment
    }
    result += "</table>"
    return result
}

func processFahrenheit(start int, stop int, increment int) string {
    result := "<h1>Temperature Conversion</h1>"
    result = result + "<table><tr><th>Fahrenheit</th><th>Celsius</th></tr>"
    for fahrenheit := start; fahrenheit <= stop; fahrenheit += increment {
        temp := float64(fahrenheit)
        celsius := (float64(temp) - 32) * 5 / 9
        result += "<tr><td>" + strconv.Itoa(fahrenheit) + "</td>"
        result += "<td>" + strconv.FormatFloat(celsius, 'f', 1, 64) + "</td></tr>"
    }
    result += "</table>"
    return result
}

lesson4.html[edit | edit source]

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Lesson 4</title>
    <link rel="stylesheet" href="styles.css">
    <style>
        p {
            min-height: 1em;
        }
    </style>
</head>

<body>
    <h1>Temperature Conversion</h1>
    <form method="POST">
        <p><label for="start">Start:</label>
            <input type="text" id="start" name="start" value="0">
        </p>
        <p><label for="stop">Stop:</label>
            <input type="text" id="stop" name="stop" value="100">
        </p>
        <p><label for="increment:">Increment</label>
            <input type="text" id="increment" name="increment" value="10">
        </p>
        <p><input type="submit" name="submit" value="Celsius">
            <input type="submit" name="submit" value="Fahrenheit">
        </p>
    </form>
    {{.Table}}
</body>

</html>

Try It[edit | edit source]

See Server-Side Scripting/Routes and Templates/Go to create a test environment.