Go 语言入门很简单:Go 实现简易Web应用

news2024/10/5 16:29:05

前言

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

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

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

用Go写Web应用

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

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

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

net/http 包

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

什么是 HTTP?

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

具体的等我写到 HTTP 协议的时候的再说,目前只是简单的了解一下。

一个简单的 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!” 作为响应。

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

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

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

代码解释

看一段代码可以从 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 开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美女如何零基础学习网络安全???

学习网络安全是一项极具挑战性的技能,大家在自学网络安全时,往往会遇到各种问题,导致迷茫。面对这种情况,解决源头问题是关键。因此,在接下来的探讨中,我们将首先分析学习网络安全的常见问题,并…

初识Spring(普通方式Bean的读取过程)

1.SpringBoot 相⽐于 Servlet 的优点总结 1. 添加外部 jar 更容易,不易出错(版本问题⽆需关注); 2. 调试项⽬更加⽅便,⽆需配置 Tomcat; 3. 发布项⽬更加⽅便,⽆需配置 Tomcat; 4. …

【iOS】—— 响应者链和事件传递链

响应者链和事件传递链 文章目录 响应者链和事件传递链二者概念响应者响应链事件UIKit继承图UIResponderUITouchUITouch几个重要属性 UITouch的两个方法(可用于view的拖拽) UIEventUIEvent几个重要属性 事件的产生与传递传递链传递过程hitTest:withEvent:…

多路归并排序

内部排序和外部排序 内部排序:整个的排序过程都在内存中进行排序 外部排序:对大文件进行排序,无法将整个需要排序的文件复制到内存,所以会把文件存储到外村,等排序时再把数据一部分一部分地调入内存进行排序&#xff…

Java基础一(String)

Java基础一(String) 概览: String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承) 在 Java 8 中,String 内部使用 char 数组存储数据。 public final class Stringimplements java.io.Serializable, Compa…

盘点并发编程的12种业务场景,面试别再说你不会并发了

前言 并发编程是一项非常重要的技术,无论在面试,还是工作中出现的频率非常高。 并发编程说白了就是多线程编程,但多线程一定比单线程效率更高? 答:不一定,要看具体业务场景。 毕竟如果使用了多线程&…

【MFC】网络通信(23)

Windows Sockets 规范是 Windows 平台下定义的可以兼容二进制数据传输的网络编程接口,是基于伯克利加利福尼亚大学的 BSD UNIX Sockets 的实现。 Socket 套接字分为两种类型:数据报 socket 和数据流 socket。 数据报套接字,即无连接套接字&…

网络通信基础 - 多路复用技术(频分多路复用、时分多路复用、波分多路复用)

文章目录 1 概述1.1 复用器 MUX 2 分类2.1 频分多路复用 FDM2.2 时分多路复用 TDM2.3 波分多路复用 WDM 1 概述 1.1 复用器 MUX 多路复用技术:把多个低速信道组合成一个高速信道的技术这种技术要用到两个设备,统称为 多路器(MUX&#xff09…

Chapter13-基于 Netty 的通信实现

13.l Netty 介绍 Netty 是一个网络应用框架,或者说是一个 Java 网络开发库。 Netty 提供异步事件驱动的方式,使用它可以快速地开发出高性能的网络应用程序,比如客户端/服务器自定义协议程序,大大简化了网络程序的开发过…

ParticleSystem中的Culling Mode对耗时有怎样的影响

1)ParticleSystem中的Culling Mode对耗时有怎样的影响 ​2)关于API,OpenGL和Vulkan的疑问 3)SVC分别搜集Keyword,多次搜集与单独搜集Warmup内存比较 4)Occlusion Culling能否降低Culling耗时 这是第332篇UW…

kaggle酶稳定性预测第三名解决方案分享

最近在kaggle参加了诺维信举办的酶稳定性预测比赛 ,最终很幸运获得了第三名,这篇文章主要是简单介绍一下解决方案,具体的数据和题目要求可访问上面的链接。 文章目录 模型概述特征工程模型XGB1XGB2XGB3 EnsembleNESP 3D geometryFoldXThermo…

AI即将夺走程序员的工作?实操验证

随着ChatGPT的普及,许多媒体开始报道“AI即将夺走程序员的工作”、“AI来了!各大长都开始大幅度裁员”,这让一些初级码农感到担忧,而一些高级程序员则表示不屑一顾。这到底是不是“狼来了”。今天,我们将进行实际测试来…

实例了解GOT,PLT和动态链接

深入了解GOT,PLT和动态链接 我们使用一个简单的例子来了解动态链接库的链接过程,以及在这个过程中使用到的GOT和PLT的作用是什么。 文件准备 代码结构如下所示: [rootlocalhost test]# tree . . ├── main.c └── symbol.csymbol.c的内容如下&am…

聊聊布隆过滤器

目录 一、什么是布隆过滤器? 二、使用场景 三、原理 四、使用 4.1、Guava实现 4.2、Redisson实现 一、什么是布隆过滤器? 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的,是一种数据结构。它实际…

推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别

随着电子商务的迅猛发展,物流配送服务已然成为企业竞争最为核心的环节,一个全面、完善的物流配送方案,能够帮助企业满足客户交期、节约运输和库存成本,促进各环节沟通,提高生产稳定性。同时,物流配送的许多…

如何在Java中高效地实现数字的反转和字符串的拼接?

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

2023爱分析·工业互联网解决方案-设备后市场服务市场厂商评估报告

01 研究范围定义 “十四五”期间工信部等发布《“十四五”智能制造发展规划》,强调智能制造是我国制造强国主攻方向,加快推动智能制造发展,深化智能推广应用,开拓制造业数字化转型升级新路径,智能制造市场发展潜力进…

Pyqt应用相关之与Excel的联接

利用所学相关Pyqt实现对于Excel文件内部数据的处理,首先需要获取Excel的数据,在获取后进行保存处理即可完成相应的操作。 def save_data_btn_click(self):dir self.save_dir_text.text().strip()self.data_frame_group.to_excel(dir output.xlsx,sheet…

IMX6ULLPRO交叉编译第一个APP和第一个led驱动

目录 配置交叉编译工具链 永久生效 测试交叉编译工具链 第一个交叉编译程序 开发板运行 LED第一个驱动 开发板下操作 执行测试程序 配置交叉编译工具链 交叉编译工具链用来在 Ubuntu 主机上编译应用程序,而这些应用程序是在 ARM 等其他平台上运行…