go go go 出发咯 - go web开发入门系列(一) helloworld

go go go 出发咯 - go web开发入门系列(一) helloworld


Go 语言(又称 Golang)凭借其简洁的语法、出色的性能和强大的并发处理能力,在 Web 开发领域变得越来越受欢迎。与其他语言不同,Go 拥有一个非常强大的标准库 net/http,让你无需依赖任何第三方框架,就能轻松构建起一个功能完整的 Web 服务器。

这篇博文将带你从零开始,一步步学习如何使用 net/http 包来创建你的第一个 Go Web 应用。

开始之前,先叠个甲,默认你现在已经学完了go的基础部分,现在来学习go web相关的内容,使用go语言进行后端开发


准备工作

在开始之前,请确保你已经:

  1. 安装了 Go
  2. 配置好了你的 Go 开发环境(例如设置了 GOPATH 或使用 Go Modules)。
  3. 了解 Go 语言的基础语法。

ps:我使用的go sdk 是 go1.24.4 windows/386

1. 你的第一个 "Hello, World" 服务器

让我们从一个最简单的 Web 服务器开始。搭建最简单的go应用服务

代码示例

创建一个名为 main.go 的文件,并输入以下代码:

go 复制代码
package main

import (
	"fmt"
	"log"
	"net/http"
)

// 定义一个处理器函数 (handler function)
// w: 用于向客户端发送响应
// r: 代表来自客户端的 HTTP 请求
func helloHandler(w http.ResponseWriter, r *http.Request) {
	// 向响应写入内容
	fmt.Fprintf(w, "Hello, World! 你访问的路径是: %s", r.URL.Path)
}

func main() {
	// 注册处理器函数,当访问根路径 "/" 时,调用 helloHandler
	http.HandleFunc("/", helloHandler)

	// 启动服务器,监听 8080 端口
	log.Println("服务器启动中,监听端口 8080...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("服务器启动失败: ", err)
	}
}

简单为上述代码做个解释:

代码解析:

  • package main: 声明这是一个可执行程序。
  • import (...) : 导入我们需要的包。net/http 是核心,fmt 用于格式化字符串,log 用于输出日志。
  • helloHandler(w http.ResponseWriter, r \*http.Request) : 这是一个处理器函数 。所有处理 Web 请求的函数都必须符合这个签名。
    • http.ResponseWriter: 一个接口,你的服务器通过它来向客户端写入响应头和响应体。
    • *http.Request: 一个结构体,包含了客户端发来的所有请求信息,比如请求方法 (GET, POST)、URL、请求头等。
  • http.HandleFunc("/", helloHandler) : 这行代码的作用是注册路由 。它告诉 net/http 包,当有请求访问网站的根路径 (/) 时,应该调用 helloHandler 函数来处理。
  • http.ListenAndServe(":8080", nil) : 这是启动服务器的关键。
    • 第一个参数 ":8080" 表示服务器在本地的 8080 端口上进行监听。
    • 第二个参数 nil 表示我们使用默认的 ServeMux(可以理解为一个路由分发器)。我们通过 http.HandleFunc 注册的处理器就是被注册到了这个默认的 ServeMux 上。

代码运行

goland中直接启动或者cd命令行进入该项目,执行

bash 复制代码
go run main.go

PS D:\workspace\Go\helloworld> go run .\main.go

2025/07/08 10:53:12 服务器启动中,监听端口 8080...

然后打开浏览器,访问localhost:8080

2. 理解处理器 (Handler)

在 Go 中,任何实现了 http.Handler 接口的类型都可以作为一个请求处理器。这个接口非常简单,只有一个方法:

复制代码
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

我们之前写的 helloHandler 函数之所以能工作,是因为 http.HandleFunc 在内部做了一个适配,将一个具有正确签名的函数(如 helloHandler)转换成了一个 http.Handler

理解 http.ResponseWriter*http.Request 是 Web 开发的关键。

  • *http.Request : 你的信息来源。
    • r.URL.Path: 获取请求的路径 (例如 /, /about)。
    • r.Method: 获取请求方法 (例如 "GET", "POST")。
    • r.Header: 获取请求头。
    • r.ParseForm()r.FormValue("key"): 解析并获取表单数据。
  • http.ResponseWriter : 你的输出工具。
    • w.Write([]byte("...")): 写入响应体,这是最常用的方法。
    • w.WriteHeader(http.StatusOK): 设置 HTTP 状态码 (例如 200 OK, 404 Not Found)。
    • w.Header().Set("Content-Type", "application/json"): 设置响应头。

3.提供静态文件服务

一个真实的网站不仅有动态内容,还需要 HTML、CSS、JavaScript 和图片等静态文件。net/http 包也提供了非常便捷的方式来处理它们。

假设你的项目结构如下:

text 复制代码
/
|-- main.go
|-- static/
    |-- index.html
    |-- style.css

index.html

html 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Go 静态网站</title>
    <link rel="stylesheet" href="/static/style.css">
</head>
<body>
    <h1>欢迎来到我的静态网站!</h1>
    <p>这个文件由 Go 服务器提供。</p>
</body>
</html>

style.css

css 复制代码
body {
    font-family: sans-serif;
    background-color: #f0f0f0;
    color: #333;
}

修改main.go文件如下:

go 复制代码
package main

import (
	"log"
	"net/http"
)

func main() {
	// 创建一个文件服务器,指向 "static" 目录
	fs := http.FileServer(http.Dir("./static"))

	// 将 /static/ 路径的请求交给文件服务器处理
	// StripPrefix 会移除 URL 中的 /static/ 前缀,这样文件服务器才能在 static/ 目录中找到文件
	http.Handle("/static/", http.StripPrefix("/static/", fs))

	// 根路径的处理器,可以用来提供主页
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		http.ServeFile(w, r, "./static/index.html")
	})

	log.Println("服务器启动中,监听端口 8080...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("服务器启动失败: ", err)
	}
}

代码简单解释:

http.FileServer(http.Dir("./static")) : 创建了一个能够提供 static 目录下文件服务的处理器。

http.Handle("/static/", ...) : 使用 http.Handle 注册一个 http.Handler。所有以 /static/ 开头的请求都会被这个文件服务器处理。

http.StripPrefix(...) : 这是一个适配器,它会修改请求的 URL。例如,当浏览器请求 /static/style.css 时,StripPrefix 会把 /static/ 去掉,然后把剩下的 /style.css 交给文件服务器。文件服务器就会去 static 目录下寻找 style.css 文件。

http.ServeFile(...) : 这是一个便捷函数,用于直接响应一个文件。我们用它来将 index.html 作为根路径的默认页面。

再次运行,访问localhost:8080,可以看到静态页面被渲染到了访问网页上。

那么至此,简易的使用 net/http 的后端内容已经搭建完成。

相关推荐
一只小青团1 小时前
Python之面向对象和类
java·开发语言
qq_529835352 小时前
ThreadLocal内存泄漏 强引用vs弱引用
java·开发语言·jvm
景彡先生2 小时前
C++并行计算:OpenMP与MPI全解析
开发语言·c++
LuciferHuang3 小时前
震惊!三万star开源项目竟有致命Bug?
前端·javascript·debug
GISer_Jing3 小时前
前端实习总结——案例与大纲
前端·javascript
天天进步20153 小时前
前端工程化:Webpack从入门到精通
前端·webpack·node.js
量子联盟3 小时前
原创-基于 PHP 和 MySQL 的证书管理系统,免费开源
开发语言·mysql·php
姑苏洛言4 小时前
编写产品需求文档:黄历日历小程序
前端·javascript·后端
知识分享小能手4 小时前
Vue3 学习教程,从入门到精通,使用 VSCode 开发 Vue3 的详细指南(3)
前端·javascript·vue.js·学习·前端框架·vue·vue3
姑苏洛言4 小时前
搭建一款结合传统黄历功能的日历小程序
前端·javascript·后端