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

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开发的热门选择。在本篇文章中&#xff0c;我们将介绍如何使用Go语言构建简单的Web应用程序&#xff0c;包括路由、模板、数据库连接和静态文件服务。 准备工作 在开始之前…...

保姆级教程——VSCode如何在Mac上配置C++的运行环境

vscode官方下载&#xff1a; 点击官网链接&#xff0c;下载对应的pkg&#xff0c;安装打开&#xff1b; https://code.visualstudio.com/插件安装 点击箭头所指插件商店按钮&#xff0c;yyds&#xff1b; 下载C/C 插件&#xff1b; ![外链图片转存 下载CodeLLDB插件&#x…...

Java 操作FTP服务器进行下载文件

用Java去操作FTP服务器去做下载&#xff0c;本文章里面分为单个下载和批量下载&#xff0c;批量下载只不过多了一层循环&#xff0c;为了方便参考&#xff0c;我代码都贴出来了。 不管单个下载还是多个&#xff0c;一定要记得&#xff0c;远程服务器的直接写文件夹路径&#xf…...

物理机服务器应该注意的事

物理机服务器应该注意的事 1、选址 服务器是个非常重要的硬件产品&#xff0c;对机房的也是有一定的要求的&#xff0c;比如温度、安全性&#xff0c;噪音、电源稳定性等等问题都需要解决!但是不是每个人都会选择自己建立一个机房&#xff0c;毕竟各方面加起来的成本都太高。这…...

信息化发展24

信息技术的发展 1 &#xff09;在计算机软硬件方面&#xff0c; 计算机硬件技术将向超高速、超小型、平行处理、智能化的方向发展&#xff0c; 计算机硬件设备的体积越来越小、速度越来越高、容量越来越大、功耗越来越低、可靠性越来越高。 2 &#xff09;计算机软件越来越丰富…...

Qt开发_调用OpenCV(3.4.7)设计完成人脸检测系统

一、前言 近年来,人脸识别技术得到了广泛的应用,它可以在各种场景中实现自动化的人脸检测和识别,例如安防监控、人脸解锁、人脸支付等。 该项目的目标是设计一个简单易用但功能强大的人脸检测系统,可以实时从摄像头采集视频,并对视频中的人脸进行准确的检测和框选。通过…...

Java 中 List 删除元素

fori循环 删除某个元素后&#xff0c;list的大小发生了变化&#xff0c;会导致遍历准确。 这种方式可以用在删除特定的一个元素时使用&#xff0c;但不适合循环删除多个元素时使用 增强for循环 删除元素后继续循环会报错误信息ConcurrentModificationException&#xff0c;但是…...

Redis:StringRedisTemplate简介

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

pytorch-神经网络-手写数字分类任务

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

【群智能算法改进】一种改进的鹈鹕优化算法 IPOA算法[1]【Matlab代码#57】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始POA算法2. 改进后的IPOA算法2.1 Sine映射种群初始化2.2 融合改进的正余弦策略2.3 Levy飞行策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 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 -【】&#xff1b;‘;console.log(str1.concat(str2,str3))//12345678abcdefgh-【】&#xff1b;‘ 2.includes() 判断字符串中是否包含指定值&#xff0c;返回布尔值…...

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汉化一个插件 制作插件汉化工具

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

从过滤器初识责任链设计模式

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

Redis7安装配置

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…...

切分支解决切不走因为未合并的路径如何解决

改代码的时候改做分支了&#xff0c;本来是在另一个分支上面改代码&#xff0c;结果改到另一个放置上面&#xff0c;然后想着使用git stash进行保存&#xff0c;然后切到另外一个分支再pop&#xff0c;结果不行。 报这个错误&#xff0c;导致切不过去&#xff0c;因为我这边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…...

UE5 产品三维交互展示 创意实现

1. UE5产品三维交互展示的核心价值 想象一下&#xff0c;你正在向客户展示一款全新的无人机产品。传统的二维图片和视频已经无法满足需求&#xff0c;客户希望全方位了解产品细节&#xff0c;甚至能亲手"拆解"查看内部构造。这正是UE5三维交互展示的用武之地。 UE5…...

保障企业级应用安全,如何利用 Taotoken 管理 API 密钥与审计日志

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 保障企业级应用安全&#xff0c;如何利用 Taotoken 管理 API 密钥与审计日志 在中大型企业的开发实践中&#xff0c;将大模型能力集…...

卫星通信安全认证技术解析与应用指南

1. 卫星通信安全认证技术概述 卫星通信作为现代信息基础设施的重要组成部分&#xff0c;其安全性直接关系到国家安全和经济发展。在近地轨道卫星数量激增、天地一体化网络快速发展的背景下&#xff0c;传统地面网络的安全认证方案已无法满足卫星通信的特殊需求。卫星信道具有长…...

Touchpoint:命令行工具集中管理工作上下文,提升开发效率

1. 项目概述&#xff1a;一个被低估的开发者效率工具如果你和我一样&#xff0c;日常开发工作需要在多个代码仓库、项目管理工具&#xff08;如Jira、Linear&#xff09;、文档平台&#xff08;如Confluence、Notion&#xff09;和沟通软件&#xff08;如Slack&#xff09;之间…...

Allegro 16.6 高效布线实战:Region规则、Xnet等长与模块复用的进阶技巧

Allegro 16.6 高效布线实战&#xff1a;Region规则、Xnet等长与模块复用的进阶技巧 在高速PCB设计领域&#xff0c;Allegro 16.6作为行业标杆工具&#xff0c;其深度功能往往决定了设计效率的天花板。当面对BGA封装密度突破1000pin、信号速率迈入10Gbps时代的复杂主板时&#x…...

罗技PUBG鼠标宏终极教程:告别压枪烦恼,轻松提升射击稳定性

罗技PUBG鼠标宏终极教程&#xff1a;告别压枪烦恼&#xff0c;轻松提升射击稳定性 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求…...

ARM Neoverse-V3架构解析与性能优化实战

1. ARM Neoverse-V3架构概览作为Arm公司面向基础设施领域的最新处理器IP&#xff0c;Neoverse-V3代表了当前服务器级处理器的顶尖设计水平。我在实际芯片开发中多次接触该架构&#xff0c;其设计哲学可概括为&#xff1a;通过精细化微架构控制实现性能与能效的完美平衡。1.1 指…...

别再让某个用户占满硬盘了!手把手教你用Linux quota给CentOS 7/8的/home目录设置磁盘限额

别再让某个用户占满硬盘了&#xff01;手把手教你用Linux quota给CentOS 7/8的/home目录设置磁盘限额 想象一下这样的场景&#xff1a;你管理的服务器上&#xff0c;十几个开发人员共享着同一个存储空间。某天突然收到警报——磁盘空间不足&#xff01;调查后发现&#xff0c;一…...

别再手动调色了!用Matlab bar3函数一键生成论文级渐变三维柱状图(附完整代码)

别再手动调色了&#xff01;用Matlab bar3函数一键生成论文级渐变三维柱状图&#xff08;附完整代码&#xff09; 科研图表的美观程度直接影响论文的第一印象&#xff0c;而三维柱状图在展示多维度数据时尤为常见。传统手动调整每个柱体的颜色、透明度、光照效果不仅耗时&#…...

ARM Jazelle技术:硬件加速Java字节码执行详解

1. ARM Jazelle技术概述Jazelle技术是ARM架构中用于硬件加速Java字节码执行的关键扩展&#xff0c;最早出现在ARMv5TE架构中。这项技术通过在处理器内部集成Java字节码执行单元&#xff0c;实现了Java虚拟机(JVM)功能的硬件化。与传统的软件解释器相比&#xff0c;Jazelle能够将…...