当前位置: 首页 > java >正文

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 的文件,并输入以下代码:

package mainimport ("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() {// 注册处理器函数,当访问根路径 "/" 时,调用 helloHandlerhttp.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命令行进入该项目,执行

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 包也提供了非常便捷的方式来处理它们。

假设你的项目结构如下:

/
|-- main.go
|-- static/|-- index.html|-- style.css

请添加图片描述

index.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

body {font-family: sans-serif;background-color: #f0f0f0;color: #333;
}

修改main.go文件如下:

package mainimport ("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 的后端内容已经搭建完成。

http://www.xdnf.cn/news/14891.html

相关文章:

  • 【OceanBase诊断调优】—— 执行计划显示分区 PARTITIONS[P0SP9] 如何查询是哪个分区?
  • 8、保存应用数据
  • 基于Docker Compose部署Traccar容器与主机MySQL的完整指南
  • Xilinx Vivado开发环境快速导出hdf文件(bat批处理)
  • 独立开发A/B测试实用教程
  • 从问题出发看Spring的对象创建与管理
  • 人工智能-基础篇-23-智能体Agent到底是什么?怎么理解?(智能体=看+想+做)
  • 【docker】-1 docker简介
  • 10.6 ChatGLM3私有数据微调实战:24小时打造高精度模型,显存直降60%
  • 七牛云Java开发面试题及参考答案(60道面试题汇总)
  • Swift 解 LeetCode 320:一行单词有多少种缩写可能?用回溯找全解
  • 初识cdp协议(一)
  • 【Mac 从 0 到 1 保姆级配置教程 19】- 英语学习篇-我的英语工作流分享(AI 辅助学习)
  • APM与ChibiOS系统
  • Ubunt20.04搭建GitLab服务器,并借助cpolar实现公网访问
  • React-useReducer-useMemo
  • LabVIEW与FPGA超声探伤
  • 软考(软件设计师)存储管理—虚拟存储器管理,页面置换算法
  • Docker 稳定运行与存储优化全攻略(含可视化指南)
  • verilog中timescale指令的使用
  • Web Worker:让前端飞起来的隐形引擎
  • 物联网技术的关键技术与区块链发展趋势的深度融合分析
  • (倍增)洛谷 P1613 跑路/P4155 国旗计划
  • 嵌入式数据库sqlite测试程序
  • 深度学习篇---深度学习常见的应用场景
  • 铸造软件交付的“自动驾驶”系统——AI大模型如何引爆DevOps革命
  • 锁和事务的关系
  • ipmitool 使用简介(ipmitool sel list ipmitool sensor list)
  • 大数据Hadoop之——Flink1.17.0安装与使用(非常详细)
  • 网安系列【8】之暴力破解入门