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

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.dtcms.com/a/269742.html

相关文章:

  • uniapp使用 renderjs 多平台谷歌地图(Google Map)的适配
  • 力扣-31.下一个排列
  • React Native安卓刘海屏适配终极方案:仅需修改 AndroidManifest.xml!
  • 【openGLES】安卓端EGL的使用
  • Javafx教程(1)——初始Javafx
  • 工业HMI的智能化转型:边缘计算与预测性维护的深度融合
  • 自定义RecyclerView的ItemDecoration,用于处理网格布局间距装饰器(支持边缘间距独立控制)
  • ubuntu vscode 点击变量链接进去后 怎么返回原来的位置
  • LocalStorage和SessionStorage的区别和应用
  • 马尔可夫决策过程
  • python办公自动化----使用pandas和os合并多个订单表
  • 【python】 `parse_time_to_seconds` 在功能及健壮性上有以下主要区别
  • ​扣子Coze飞书多维表插件添加数据记录
  • 【UE5】虚幻引擎小百科
  • std::function
  • coze平台AI Agent开发入门之工作流的基本使用方法
  • Redis 缓存机制 及问题场景 及解决方案
  • 接口自动化工具-SoapUI
  • kotlin
  • Ubuntu22.04下微星B850M主板 无wifi模块
  • AR 双缝干涉实验亮相:创新科技实验范式,开拓 AR 技术新局​
  • 传输层协议TCP、UDP
  • SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:整体布局、架构调整(二)
  • 基于FPGA的累加算法实现
  • 2. 两数相加
  • 从零实现一个GPT 【React + Express】--- 【1】初始化前后端项目,实现模型接入+SSE
  • 领域驱动设计(DDD)重塑金融系统架构
  • Qt 与Halcon联合开发九:算法类设计与实现讲解(附源码)
  • AlphaEvolve:谷歌的算法进化引擎 | 从数学证明到芯片设计的AI自主发现新纪元
  • 告别“电量焦虑”,BLE如何提升可穿戴设备续航能力?