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

从零到一:用Go语言构建你的第一个Web服务

使用Go语言从零开始搭建一个Web服务,包括环境搭建、路由处理、中间件使用、JSON和表单数据处理等关键步骤,提供丰富的代码示例。

关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,上亿营收AI产品研发负责人。

file

环境搭建

在开始开发之前,我们需要确保本地环境已经安装了Go语言开发环境。

安装Go语言

可以从Go语言官网下载适合你操作系统的安装包,并按照官网的指南进行安装。

配置开发工具

推荐使用VS Code或GoLand进行Go语言开发。以下是VS Code的配置步骤:

  1. 安装VS Code编辑器。
  2. 安装Go插件:打开VS Code,进入插件市场,搜索并安装Go插件。
  3. 配置Go开发环境:确保Go语言的安装路径已添加到系统环境变量中。

创建项目结构

创建一个新的项目文件夹,并初始化Go模块。

mkdir simple-web-server
cd simple-web-server
go mod init simple-web-server

创建HTTP服务器

我们将使用Go标准库net/http来创建一个简单的HTTP服务器。

引入必要的包

在项目根目录下创建一个名为main.go的文件,并引入必要的包。

package mainimport ("fmt""net/http"
)

创建简单的HTTP处理函数

我们需要创建一个处理函数来响应HTTP请求。

func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}

创建并启动HTTP服务器

main函数中,我们将创建HTTP服务器并指定端口号。

func main() {http.HandleFunc("/", helloHandler) // 设置路由fmt.Println("Starting server at port 8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

完整的main.go文件如下:

package mainimport ("fmt""net/http"
)func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}func main() {http.HandleFunc("/", helloHandler) // 设置路由fmt.Println("Starting server at port 8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

运行服务器

在终端中运行以下命令来启动服务器:

go run main.go

打开浏览器,访问http://localhost:8080,你将看到页面显示“Hello, World!”。

路由与请求处理

我们将扩展HTTP服务器,增加更多的路由和处理函数。

添加新的路由

添加一个新的处理函数来处理/greet路径的请求。

func greetHandler(w http.ResponseWriter, r *http.Request) {name := r.URL.Query().Get("name")if name == "" {name = "Guest"}fmt.Fprintf(w, "Hello, %s!", name)
}

注册新的路由

main函数中注册新的路由:

func main() {http.HandleFunc("/", helloHandler)      // 设置根路径路由http.HandleFunc("/greet", greetHandler) // 设置/greet路径路由fmt.Println("Starting server at port 8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

测试新的路由

重新启动服务器,并访问http://localhost:8080/greet?name=Go,页面将显示“Hello, Go!”。

处理表单数据

我们将扩展服务器以处理POST请求和表单数据。

创建HTML表单

添加一个新的处理函数来显示HTML表单:

func formHandler(w http.ResponseWriter, r *http.Request) {html := `<html><body><form method="POST" action="/submit"><label for="name">Name:</label><input type="text" id="name" name="name"><input type="submit" value="Submit"></form></body></html>`fmt.Fprintf(w, html)
}

处理表单提交

添加一个新的处理函数来处理表单提交:

func submitHandler(w http.ResponseWriter, r *http.Request) {if r.Method != http.MethodPost {http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)return}name := r.FormValue("name")fmt.Fprintf(w, "Form submitted! Hello, %s!", name)
}

注册新的路由

main函数中注册新的路由:

func main() {http.HandleFunc("/", helloHandler)      // 设置根路径路由http.HandleFunc("/greet", greetHandler) // 设置/greet路径路由http.HandleFunc("/form", formHandler)   // 设置/form路径路由http.HandleFunc("/submit", submitHandler) // 设置/submit路径路由fmt.Println("Starting server at port 8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Error starting server:", err)}
}

测试表单功能

重新启动服务器,并访问http://localhost:8080/form,填写表单并提交,页面将显示“Form submitted! Hello, [你的名字]!”

通过以上步骤,我们已经成功创建了一个简单的Go Web服务,并实现了路由处理和表单数据处理。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《Java初阶数据结构》----8.<java对象的比较总结>
  • springboot自动装配原理(springboot知识点梳理二)
  • Linux系统上安装zookeeper
  • Ubuntu下设置文件和文件夹用户组和权限
  • Vue项目增加路由跳转全局进度条 NProgress.js
  • 【Rust光年纪】深入了解Rust语言的关键库:功能特点与使用场景分析
  • 一文总结代理:代理模式、代理服务器
  • 【Python】基础语法(下)
  • 代码混淆与代码打包---bash脚本
  • Spring笔记(五)——事务
  • 组件化开发
  • 【C++】C++中的find方法介绍
  • 无标题栏窗口通过消息模拟拖动窗口时,无法拖动的一个原因
  • 鸿蒙应用框架开发【基于原生能力的无障碍模式】
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • 《Java编程思想》读书笔记-对象导论
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • create-react-app项目添加less配置
  • emacs初体验
  • redis学习笔记(三):列表、集合、有序集合
  • use Google search engine
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 关于使用markdown的方法(引自CSDN教程)
  • 理清楚Vue的结构
  • 如何用vue打造一个移动端音乐播放器
  • 三栏布局总结
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 思否第一天
  • 一道闭包题引发的思考
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​虚拟化系列介绍(十)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (void) (_x == _y)的作用
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (搬运以学习)flask 上下文的实现
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二十三)Flask之高频面试点
  • (九十四)函数和二维数组
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (学习日记)2024.01.19
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net Winform开发笔记(一)
  • .net 托管代码与非托管代码
  • .NET单元测试
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET运行机制