Go 语言快速入门指南:Go 实现简易 Web 应用

简介: 截止到目前为止,几乎我们的 Go 入门文章都是在终端运行的。在终端运行的代码或者运用运用程序只适合自己在环境搭好的环境下使用。也就是说,如果用户没有安装 Go 语言环境,是根本没法运行我们所写的 Go 代码,普通用户可以说已经被互联网和万维网宠坏了,他们不想为了使用你的应用而学习使用终端。

前言

截止到目前为止,几乎我们的 Go 入门文章都是在终端运行的。

在终端运行的代码或者运用运用程序只适合自己在环境搭好的环境下使用。也就是说,如果用户没有安装 Go 语言环境,是根本没法运行我们所写的 Go 代码,普通用户可以说已经被互联网和万维网宠坏了,他们不想为了使用你的应用而学习使用终端。

更有甚者,不想在手机上安装任何多余的客户端和应用。他们希望能在浏览器解决的就能在浏览器上解决,单击某个链接或者扫个二维码就能使用。这大概也就是小程序——即用即走、无需安装的设计理念了吧。


用 Go 写 Web 应用

我们在终端上运行 Go 语言是这样的:

# yuzhou_1su @ RaindeMacBook-Pro in ~/GoProjects [22:23:34] 
$ go run hello.go 
hello, world

而在 Web 端运行一个 Go 程序可能是这样的:

image.png


net/http 包

Go 提供了非常方便的内置 http 包,涵盖了 HTTP 客户端和服务端的具体实现。使用 net/http 包,我们可以很方便地编写 HTTP 客户端或服务端的程序。

什么是 HTTP?

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,定义了客户端和服务端之间请求与响应的传输标准。通过这种协议能够方便快捷的用于 Web 浏览器和 Web 服务器之间的通信。


一个简单的 Web 应用程序

本来处理来自浏览器的请求需要做大量的工作:

  • 接收来自浏览器的请求
  • 对浏览器的请求进行响应


我们新建一个 main.go 文件,然后写入如下代码:

package main
import (
  "log"
  "net/http"
)
func viewHandler(writer http.ResponseWriter, request *http.Request) {
  message := []byte("Hello, World!")
  _, err := writer.Write(message)
  if err != nil {
    log.Fatal(err)
  }
}
func main() {
  http.HandleFunc("/hello", viewHandler)
  err := http.ListenAndServe("localhost:8800", nil)
  log.Fatal(err)
}

在终端中运行上述代码,这样我们就得到一个自己的 Web 应用程序:

$ go run main.go   

此时在终端中不会看到任何输出,但是如果通过打开浏览器,输入服务器监听的地址:http://localhost:8800/hello

此时就是代表浏览器往我们的小型 Web 服务器发送了一个请求,然后服务器会响应一个 “Hello, World!” 作为响应。

image.png


如果此时,另开一个浏览器输入同一个网址,服务器会一直监听该请求,直到我们停止终端上运行的服务器,比如使用 CTRL+C 来退出我们的 main.go 函数:

$ go run main.go     
^Csignal: interrupt
(base) 

此时刷新该网址,再访问就会被拒绝,如下所示:

image.png

代码解释

看一段代码可以从 main 函数开始,代码解释如下:

  • http.HandleFunc("/hello", viewHandler) 使用了字符串 /hello 调用 http.HandleFunc , 然后调用了 viewHandler 函数,这段代码就是告诉应用程序每当收到以 /hello 结尾的 URL 请求就调用 viewHandler 函数
  • 调用 http.ListenAndServe("localhost:8800", nil) 来启动 Web 服务器,传入的字符串"localhost:8800" 表示只接受来自自己机器的 8800 端口上的请求。第二个参数 nil 值只表示将使用 HandleFunc 设置得函数来稍后处理请求。
  • 如果服务器没遇到错误,将会一直运行,知道遇到退出时,程序将记录该错误,并以错误日志输出该错误:log.Fatal(err)


然后我们来看看 viewHandler 函数:

func viewHandler(writer http.ResponseWriter, request *http.Request)

  • 服务器向 viewHandler 传递一个 http.ResponseWriter , 用于向浏览器响应写入数据
  • 还接收一个指向 http.Request 指针,该值表示浏览器的请求
  • ResponseWriter 上的 Writer 方法响应添加数据,Writer 不接受字符串,但它能接收 byte 值得切片,所以在消息中 message := []byte("Hello, World!") 将字符串“Hello, World!” 转换为 []byte
  • 然后将转化好的 message 传递给 Writer
  • ResponseWriter 的 Writer 方法返回成功写入的字节数,以及遇到的任何错误,我们不能对写入的字节数做任何有用的事情,所以忽略它。如果出现错误,将会记录下来并退出程序。

总结

Web 应用程序需要做的第一件事就是当浏览器向 Web 服务器发送请求时能够做出响应。

而 Go 语言提供了很方便的 net/http 包来简化程序化的操作,使得我们无需写任何底层代码就能实现一个简易的 Web 应用。

但是,我们肯定不会止步于此,一个功能丰富的 Web 服务器不会仅仅是提供一个 “Hello,World!” 的访问,但是我们可以通过最简单的方式来了解 Web 开发。

在后续的文章中,我们能够接触到更多关于 Go Web 开发的相关知识,这也是作者的方向,下一篇见~

相关文章
|
6天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
6天前
|
前端开发 安全 JavaScript
构建高效Web应用:前后端分离架构的实践
【9月更文挑战第4天】在数字时代,Web应用已成为企业与用户互动的主要平台。本文将介绍如何通过前后端分离的架构设计来构建高效的Web应用,探讨该架构的优势,并分享实现过程中的关键步骤和注意事项。文章旨在为开发者提供一种清晰、高效的开发模式,帮助其在快速变化的市场环境中保持竞争力。
|
11天前
|
中间件 编译器 数据处理
在web开发中应用管道过滤器
【9月更文挑战第1天】本文介绍管道-过滤器架构将数据处理流程分解为一系列独立组件,通过管道连接,适用于数据流处理如图像处理、编译器设计等。通过具体实例说明了Gin如何有效支持管道-过滤器风格的设计,构建高性能Web服务。
29 9
|
11天前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
22 0
|
11天前
|
开发者 Java 前端开发
Struts 2验证框架:如何让数据校验成为Web开发的隐形守护者?揭秘前后端一致性的秘诀
【8月更文挑战第31天】在现代Web开发中,数据验证对确保应用健壮性和良好用户体验至关重要。随着前后端分离架构的普及,保证数据校验一致性尤为关键。Struts 2 验证框架基于 JavaBean 验证 API(JSR 303/JSR 380),允许开发者通过注解或 XML 配置轻松定义验证规则,确保输入数据在执行业务逻辑前已通过验证。此外,Struts 2 支持与前端 JavaScript 验证相结合,确保前后端数据校验一致,提升用户体验。通过注解、XML 配置和资源文件,开发者可以轻松定义和调整验证规则,实现前后端一致的数据校验,提高应用健壮性。
21 0
|
11天前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
35 0
|
11天前
|
Java 数据库连接 Spring
Struts 2 插件开发竟如魔法盛宴,为框架注入超能力,开启奇幻编程之旅!
【8月更文挑战第31天】在Web开发中,Struts 2插件开发允许我们在不改动框架核心代码的前提下,通过创建实现特定接口的Java类来扩展框架功能、调整其行为或促进与其他框架(如Spring、Hibernate)的集成,从而更好地满足特定业务需求。遵循良好的设计原则与实践,能够确保插件的高效稳定运行并提升整体项目的可维护性。具体步骤包括创建项目、定义插件类、实现初始化与销毁逻辑,并将插件部署至应用中。
33 0
|
11天前
|
存储 算法 Go
|
11天前
|
开发者 Java 开发框架
JSF与EJB,打造企业级应用的神器!让你的Web应用更加稳定、高效!
【8月更文挑战第31天】在现代企业级应用开发中,JSF(JavaServer Faces)与EJB(Enterprise JavaBeans)是两大核心技术。JSF作为一款基于Java的Web应用框架,以其丰富的UI组件和表单处理功能著称;EJB则专注于提供分布式事务处理及远程调用等企业级服务。两者的结合为企业应用带来了高效便捷的开发模式。下文将通过一个简单的示例展示如何利用JSF进行用户信息的输入与保存,并借助EJB实现相关业务逻辑。尽管这一组合具有明显优势,但在实际应用中还需考虑其局限性并作出合理选择。
27 0
|
11天前
|
开发者 安全 SQL
JSF安全卫士:打造铜墙铁壁,抵御Web攻击的钢铁防线!
【8月更文挑战第31天】在构建Web应用时,安全性至关重要。JavaServer Faces (JSF)作为流行的Java Web框架,需防范如XSS、CSRF及SQL注入等攻击。本文详细介绍了如何在JSF应用中实施安全措施,包括严格验证用户输入、使用安全编码实践、实施内容安全策略(CSP)及使用CSRF tokens等。通过示例代码和最佳实践,帮助开发者构建更安全的应用,保护用户数据和系统资源。
24 0