Go语言Web开发入门指南
Go语言Web开发入门指南
欢迎来到Go语言的Web开发入门指南。Go语言因其出色的性能和并发支持而成为Web开发的热门选择。在本篇文章中,我们将介绍如何使用Go语言构建简单的Web应用程序,包括路由、模板、数据库连接和静态文件服务。
准备工作
在开始之前,确保你已经安装了Go语言的开发环境。如果尚未安装,请访问 Go官方网站 并按照指南进行安装。
创建一个简单的Web服务器
首先,让我们创建一个简单的Go程序,它将充当我们的Web服务器。创建一个名为main.go
的文件,并输入以下内容:
package mainimport ("fmt""net/http"
)func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, Web!")
}func main() {http.HandleFunc("/", handler)http.ListenAndServe(":8080", nil)
}
上述代码创建了一个简单的HTTP服务器,它监听端口8080并在根路径(“/”)上提供一个处理函数。在浏览器中访问 http://localhost:8080
,你将看到 “Hello, Web!”。
路由
在真实的Web应用中,我们通常需要更复杂的路由。我们可以使用第三方包来处理路由。一个常用的路由器是gorilla/mux
。首先,安装它:
go get -u github.com/gorilla/mux
然后,在你的main.go
文件中使用它:
package mainimport ("fmt""net/http""github.com/gorilla/mux"
)func homeHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Welcome to the Home Page!")
}func aboutHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Learn more about us on the About Page.")
}func main() {r := mux.NewRouter()r.HandleFunc("/", homeHandler)r.HandleFunc("/about", aboutHandler)http.Handle("/", r)http.ListenAndServe(":8080", nil)
}
上述代码中,我们使用了gorilla/mux
包创建了一个更复杂的路由系统。我们有一个主页路由(“/”)和一个关于页面路由(“/about”)。
模板
在真实的Web应用中,我们通常需要渲染HTML页面。Go语言的html/template
包可以帮助我们实现这一点。首先,创建一个名为templates
的文件夹,并在其中创建一个HTML模板文件,比如index.html
:
<!DOCTYPE html>
<html>
<head><title>Go Web App</title>
</head>
<body><h1>{{.}}</h1>
</body>
</html>
接下来,在你的main.go
中使用模板:
package mainimport ("fmt""html/template""net/http""github.com/gorilla/mux"
)func homeHandler(w http.ResponseWriter, r *http.Request) {tmpl, err := template.ParseFiles("templates/index.html")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}tmpl.Execute(w, "Welcome to the Home Page!")
}func aboutHandler(w http.ResponseWriter, r *http.Request) {tmpl, err := template.ParseFiles("templates/index.html")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}tmpl.Execute(w, "Learn more about us on the About Page.")
}func main() {r := mux.NewRouter()r.HandleFunc("/", homeHandler)r.HandleFunc("/about", aboutHandler)http.Handle("/", r)http.ListenAndServe(":8080", nil)
}
现在,我们的处理程序使用HTML模板来渲染页面。模板中的{{}}
是模板语法,允许我们在页面中插入动态数据。在上述代码中,我们将欢迎消息作为动态数据传递给模板。
数据库连接
在Web应用中,通常需要与数据库进行交互。Go语言有丰富的数据库驱动程序,例如database/sql
和各种数据库特定的驱动程序。以下是一个简单的示例,演示如何连接到SQLite数据库并执行查询:
首先,安装SQLite驱动程序:
go get github.com/mattn/go-sqlite3
然后,创建一个数据库连接并执行查询:
package mainimport ("database/sql""fmt""net/http""github.com/gorilla/mux"_ "github.com/mattn/go-sqlite3"
)func viewHandler(w http.ResponseWriter, r *http.Request) {db, err := sql.Open("sqlite3", "mydb.db")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer db.Close()rows, err := db.Query("SELECT name FROM users")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer rows.Close()var names []stringfor rows.Next() {var name stringif err := rows.Scan(&name); err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}names = append(names, name)}tmpl, err := template.ParseFiles("templates/index.html")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}tmpl.Execute(w, names)
}func main() {r := mux.NewRouter()r.HandleFunc("/", viewHandler)http.Handle("/", r)http.ListenAndServe(":8080", nil)
}
上述代码中,我们使用了SQLite数据库,并从表中查询用户的名称。查询结果通过模板渲染到页面中。
静态文件服务
Web应用通常需要提供静态文件,如CSS、JavaScript和图像。你可以使用http.FileServer
来为你的应用提供静态文件服务。以下是一个示例:
package mainimport ("fmt""net/http""github.com/gorilla/mux"
)func homeHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Welcome to the Home Page!")
}func main() {r := mux.NewRouter()r.HandleFunc("/", homeHandler)// 静态文件服务r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))http.Handle("/", r)http.ListenAndServe(":8080", nil)
}
在上述代码中,我们创建了一个静态文件服务,它将所有以"/static/"开头的URL映射到static
文件夹中的文件。
总结
通过这篇文章,你学习了如何使用Go语言构建一个简单的Web应用程序,包括路由、模板、数据库连接和静态文件
相关文章:
Go语言Web开发入门指南
Go语言Web开发入门指南 欢迎来到Go语言的Web开发入门指南。Go语言因其出色的性能和并发支持而成为Web开发的热门选择。在本篇文章中,我们将介绍如何使用Go语言构建简单的Web应用程序,包括路由、模板、数据库连接和静态文件服务。 准备工作 在开始之前…...

保姆级教程——VSCode如何在Mac上配置C++的运行环境
vscode官方下载: 点击官网链接,下载对应的pkg,安装打开; https://code.visualstudio.com/插件安装 点击箭头所指插件商店按钮,yyds; 下载C/C 插件; 
Qt开发_调用OpenCV(3.4.7)设计完成人脸检测系统
一、前言 近年来,人脸识别技术得到了广泛的应用,它可以在各种场景中实现自动化的人脸检测和识别,例如安防监控、人脸解锁、人脸支付等。 该项目的目标是设计一个简单易用但功能强大的人脸检测系统,可以实时从摄像头采集视频,并对视频中的人脸进行准确的检测和框选。通过…...
Java 中 List 删除元素
fori循环 删除某个元素后,list的大小发生了变化,会导致遍历准确。 这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用 增强for循环 删除元素后继续循环会报错误信息ConcurrentModificationException,但是…...

Redis:StringRedisTemplate简介
(笔记总结自b站黑马程序员课程) 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。 为了减少内存的消耗,我们可以采用手动序列化的方式&am…...

pytorch-神经网络-手写数字分类任务
Mnist分类任务: 网络基本构建与训练方法,常用函数解析 torch.nn.functional模块 nn.Module模块 读取Mnist数据集 会自动进行下载 %matplotlib inlinefrom pathlib import Path import requestsDATA_PATH Path("data") PATH DATA_PATH / &…...

【群智能算法改进】一种改进的鹈鹕优化算法 IPOA算法[1]【Matlab代码#57】
文章目录 【获取资源请见文章第5节:资源获取】1. 原始POA算法2. 改进后的IPOA算法2.1 Sine映射种群初始化2.2 融合改进的正余弦策略2.3 Levy飞行策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 原始POA算法 此…...

C++初阶:C++入门
目录 一.iostream文件 二.命名空间 2.1.命名空间的定义 2.2.命名空间的使用 三.C的输入输出 四.缺省参数 4.1.缺省参数概念 4.2.缺省参数分类 4.3.缺省参数注意事项 4.4.缺省参数用途 五.函数重载 5.1.重载函数概念 5.2.C支持函数重载的原理--名字修饰(name Mangl…...
golang操作数据库--gorm框架、redis
目录 1.数据库相关操作(1)非orm框架①引入②初始化③增删改查 (2) io版orm框架 (推荐用这个)①引入②初始化③增删改查④gorm gen的使用 (3) jinzhu版orm框架①引入②初始化③增删改查 2.redis(1)引入(2)初始化①普通初始化②v8初始化③get/set示例 1.数据库相关操作 (1)非orm…...
10 种常用的字符串方法
10 种常用的字符串方法 1.concat() 字符串拼接 const str1 12345678;const str2 abcdefgh;const str3 -【】;‘;console.log(str1.concat(str2,str3))//12345678abcdefgh-【】;‘ 2.includes() 判断字符串中是否包含指定值,返回布尔值…...
CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06
CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06 一、题目名称:生命进化书二、题目名称:订班服三、题目名称:c++难题-大数加法一、题目名称:生命进化书 时间限制:1000ms内存限制:256M 题目描述: 小A有一本生命进化书,以一个树形结构记载了所有生…...

echarts饼图label自定义样式
生成的options {"tooltip": {"trigger": "item","axisPointer": {"type": "shadow"},"backgroundColor": "rgba(9, 24, 48, 0.5)","borderColor": "rgba(255,255,255,0.4)&q…...

Unity汉化一个插件 制作插件汉化工具
我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...尝试在Unity中汉化一个插件 效果: 思路: 如何在Unity中把一个自己喜欢的插件…...

从过滤器初识责任链设计模式
下面用的过滤器都是注解方式 可以使用非注解方式,就是去web.xml配置映射关系 上面程序的执行输出是 再加一个过滤器 下面来看一段程序 输出结果 和过滤器是否非常相识 但是上面这段程序存在的问题:在编译阶段已经完全确定了调用关系,如果你想改变他们的调用顺序或者继续添加一…...

Redis7安装配置
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

切分支解决切不走因为未合并的路径如何解决
改代码的时候改做分支了,本来是在另一个分支上面改代码,结果改到另一个放置上面,然后想着使用git stash进行保存,然后切到另外一个分支再pop,结果不行。 报这个错误,导致切不过去,因为我这边pop…...

自动化运维:Ansible之playbook基于ROLES部署LNMP平台
目录 一、理论 1.playbook剧本 2.ROLES角色 3.关系 4.Roles模块搭建LNMP架构 二、实验 1.Roles模块搭建LNMP架构 三、问题 1.剧本启动php报错语法问题 2.剧本启动mysql报错语法问题 3.剧本启动nginx开启失败 4.剧本安装php失败 5.使用yum时报错 6.rpm -Uvh https…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...