【GoWeb示例】通过示例学习 Go 的 Web 编程

文章目录

  • 你好世界
  • HTTP 服务器
  • 路由(使用 gorilla/mux)
  • 连接到 MySQL 数据库
  • MySQL 数据库简单操作
  • 模板
  • 静态资源和文件操作
  • 表单处理
  • 中间件(基础)
  • 中间件(高级)
  • 会话
  • JSON
  • Websockets
  • 密码哈希

你好世界

Go语言创建可在浏览器中查看的 Web 服务器

代码如下:

package main

import (
	"fmt"
	"net/http" //用于创建 HTTP 服务器和处理 HTTP 请求
)

// 将处理请求的函数注册到 HTTP 服务器上
func main() {
   
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    //注册一个处理器,用于指定特定路径(在这里是 /)的请求。
		// 使用 Fprintf 写入响应,并检查错误 ,用于格式化字符串并将其写入到指定的 io.Writer 接口(例如 HTTP 响应、文件等)
		if _, err := fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path); err != nil {
   
			// 如果发生错误,设置HTTP状态码并记录错误
			http.Error(w, "Internal Server Error", http.StatusInternalServerError)
			fmt.Println("Error writing response:", err) // 记录错误信息
		}
	})
	//处理函数(http.HandleFunc的第二个参数)接收两个参数:w(用于写入响应)和 r(包含请求信息)

	// 启动 HTTP 服务器,监听端口 80
	err := http.ListenAndServe(":80", nil)
	if err != nil {
   
		// 如果发生错误,输出错误信息
		fmt.Println("Error starting server:", err)
	}
}

//通过访问 http://localhost/,可向正在本地运行的 HTTP 服务器发送请求
//操作系统会自动将 localhost 映射到 127.0.0.1
//localhost: 这是一个特殊的域名,通常用于指向当前计算机。无论你在哪个操作系统上,访问 http://localhost 都会将请求发送到本机。
//127.0.0.1: 这是一个回环地址(loopback address),是计算机内部的 IP 地址,也表示本机。它和 localhost 是等价的,访问这两个地址会得到相同的结果。

执行流程如下:
【GoWeb示例】通过示例学习 Go 的 Web 编程_第1张图片
测试服务器:
在常用的网页浏览器地址栏输入 http://localhost/,然后按下回车键:
【GoWeb示例】通过示例学习 Go 的 Web 编程_第2张图片

HTTP 服务器

package main

import (
	"fmt"
	"net/http"
)

func main() {
   
	// 处理根路径的请求
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
   
		// 当访问根路径时,发送欢迎消息,并检查错误
		if _, err := fmt.Fprintf(w, "Welcome to my website!"); err != nil {
   
			// 如果发生错误,设置 HTTP 状态码并记录错误
			http.Error(w, "Internal Server Error", http.StatusInternalServerError)
			fmt.Println("Error writing response:", err) // 记录错误信息
		}
	})

	// 设置静态文件服务器
	fs := http.FileServer(http.Dir("static/"))                // 创建一个文件服务器,指向 static/ 目录
	http.Handle("/static/", http.StripPrefix("/static/", fs)) // 处理 /static/ 路径的请求

	// 启动 HTTP 服务器,监听 80 端口,并处理错误
	if err := http.ListenAndServe(":80", nil); err != nil {
   
		// 如果发生错误,输出错误信息
		fmt.Println("Error starting server:", err)
	}
}

路由(使用 gorilla/mux)

package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/mux"
)

func main() {
   
	// 创建一个新的路由器
	r := mux.NewRouter()

	// 定义路由,支持动态路径变量
	r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) {
   
		vars := mux.Vars(r)    // 从请求中提取变量
		title := vars["title"] // 获取书名
		page := vars["page"]   // 获取页码

		// 写入响应
		fmt.Fprintf(w, "You've requested the book: %s on page %s\n", title, page)
	})

	// 启动 HTTP 服务器,监听 80 端口
	http.ListenAndServe(":80", r)
}

可以在浏览器中访问以下 URL 来测试此服务器:
http://localhost/books/Go%20Programming/page/10
【GoWeb示例】通过示例学习 Go 的 Web 编程_第3张图片

连接到 MySQL 数据库

使用docker:

  • 安装docker
  • 在命令行启动MySql容器
    创建一个名为 my-mysql 的容器,并设置根用户密码为 password,同时创建一个名为 mydb 的数据库:
    docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=mydb -p 3306:3306 -d mysql:latest
  • 检查MySql容器是否运行
    docker ps
  • 在GoLand中配置数据库连接:
package main

import (
    "database/sql"          // 用于数据库操作
    "fmt"                    // 用于打印输出
    "log"                    // 用于错误处理
    _ "github.com/go-sql-driver/mysql" // MySQL 驱动,使用匿名导入,确保驱动被加载
)


func main() {
   
	// 配置数据库连接
	dsn := "root:rootpassword@tcp(127.0.0.1:3306)/mydb?parseTime=true"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
   
		log.Fatal(err)
	}
	defer db.Close()

	// 初始化数据库连接,确保连接成功
	err = db.Ping()
	if err != nil {
   
		log.Fatal(err)
	}

	fmt.Println("Successfully connected to the database!")
}

如果不打算继续使用 MySQL 容器,可以使用以下命令停止:

docker stop mysql-container

如果将来不再需要该容器,可以使用以下命令删除:

docker rm mysql-container

MySQL 数据库简单操作

package main

import (
	"database/sql" // 导入数据库操作相关包
	"fmt"          // 导入格式化输出包
	"log"          // 导入日志包,用于错误处理
	"time"         // 导入时间包,用于获取当前时间

	_ "github.com/go-sql-driver/mysql" // 导入 MySQL 驱动(使用匿名导入)
)

func main() {
   
	// 连接到 MySQL 数据库,使用 root 用户,密码为 root,数据库为 root,支持解析时间格式
	db, err := sql.Open("mysql", "root:root@(127.0.0.1:3306)/root?parseTime=true")
	if err != nil {
   
		log.Fatal(err) // 如果连接失败,打印错误并退出
	}

	// 测试数据库连接是否正常
	if err := db.Ping(); err != nil {
   
		log.Fatal(err) // 如果数据库连接不正常,打印错误并退出
	}

	// --- 创建一个新的数据库表 ---
	{
   
		query := `
            CREATE TABLE users (  -- SQL 查询,创建 users 表
                id INT AUTO_INCREMENT,  -- 自动增长的 ID
                username TEXT NOT NULL,  -- 用户名字段,不允许为空
                password TEXT NOT NULL,  -- 密码字段,不允许为空
                created_at DATETIME,     -- 创建时间字段,类型为 DATETIME
                PRIMARY KEY (id)         -- 设置 ID 为主键
            );`

		// 执行创建表的 SQL 查询
		if _, err := db.Exec(query); err != nil {
   
			log.Fatal(err) // 如果执行查询出错,打印错误并退出
		}
	}

	// --- 插入一个新用户 ---
	{
   
		username := "johndoe"   // 新用户的用户名
		password := "secret"    // 新用户的密码
		createdAt := time.

你可能感兴趣的:(Go,Web,示例,golang)