【Go系列】Go语言的网络服务
承上启下
我们既然知道了Go语言的语法,也了解到了Go语言如何协同工作机制。那么对于这样一款天生支持高并发的语言,它的用武之地自然而然的就是网络服务了。我们今天学学如何使用网络服务。
开始学习
Go语言使用网络服务
在Go语言中,使用网络服务通常涉及到net
和net/http
标准库。以下是一些基本概念和步骤:
1. HTTP客户端
使用Go语言发送HTTP请求非常简单,以下是如何使用net/http
包创建HTTP客户端的步骤:
发送GET请求
package mainimport ("fmt""io/ioutil""net/http"
)func main() {resp, err := http.Get("http://example.com/")if err != nil {panic(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {panic(err)}fmt.Println(string(body))
}
发送POST请求
package mainimport ("bytes""fmt""io/ioutil""net/http"
)func main() {data := []byte(`{"key1":"value1", "key2":"value2"}`)resp, err := http.Post("http://example.com/", "application/json", bytes.NewBuffer(data))if err != nil {panic(err)}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {panic(err)}fmt.Println(string(body))
}
2. 自定义HTTP客户端
你可以创建一个自定义的HTTP客户端,以设置超时、代理和其他选项。
client := &http.Client{Timeout: time.Second * 10,
}req, err := http.NewRequest("GET", "http://example.com/", nil)
if err != nil {panic(err)
}resp, err := client.Do(req)
// 处理响应
实现RESTful API
RESTful API是一种流行的网络服务架构风格,它使用标准的HTTP方法来执行操作。以下是使用Go语言实现RESTful API的步骤:
1. 设置HTTP服务器
package mainimport ("fmt""log""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 {log.Fatal(err)}
}
2. 定义资源
在RESTful API中,每个资源都应该对应一个URL。以下是一个简单的用户资源示例:
type User struct {ID int `json:"id"`Name string `json:"name"`
}
3. 实现HTTP方法
为资源实现GET、POST、PUT、DELETE等HTTP方法。
GET方法
func getUserHandler(w http.ResponseWriter, r *http.Request) {// 假设我们有一个函数来获取用户user := getUserFromDB(1)w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(user)
}
POST方法
func createUserHandler(w http.ResponseWriter, r *http.Request) {var user Usererr := json.NewDecoder(r.Body).Decode(&user)if err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}// 假设我们有一个函数来创建用户createdUser := createUserInDB(user)w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(createdUser)
}
4. 路由
使用gorilla/mux
或其他路由库来处理更复杂的路由需求。
r := mux.NewRouter()
r.HandleFunc("/users/{id}", getUserHandler).Methods("GET")
r.HandleFunc("/users", createUserHandler).Methods("POST")
http.ListenAndServe(":8080", r)
5. 错误处理
在API中正确处理错误非常重要。
if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return
}
6. 中间件
使用中间件来处理跨域请求、日志记录、身份验证等。
r.Use(loggingMiddleware)
通过以上步骤,你可以使用Go语言构建一个健壮的RESTful API。Go语言的简洁性和强大的标准库使得它成为开发网络服务的理想选择。希望这些知识能帮助你更好地理解和实现Go语言的网络服务。
GO的IO多路复用
在Go语言中,"IO多路复用"通常指的是在网络编程中使用的一种技术,它允许单个网络连接处理多个数据流。这通常是通过使用TCP协议的端口多路复用来实现的,而不是直接在IP层进行多路复用。Go语言通过其net
包提供了这种能力,使得可以轻松地实现多路复用。
以下是关于Go中实现IP多路复用的一些关键点:
1. net
包
Go的net
包提供了TCP、UDP、IP、ICMP等网络协议的实现。要实现IP多路复用,我们通常关注的是TCP连接。
2. net.Listener
和net.Conn
net.Listener
接口定义了用于监听网络连接的方法。net.Conn
接口定义了用于处理网络连接的方法。
3. Accept函数
net.Listener
的Accept
方法用于接收新的连接。在多路复用场景中,这个方法会在一个循环中被调用,以便不断地接收新的连接。
4. Goroutines
Go的并发模型通过goroutines实现,这使得为每个新连接启动一个goroutine变得非常简单。这样,即使是一个单一的监听器也可以同时处理多个连接。
以下是一个简单的TCP服务器示例,展示了如何在Go中使用多路复用来处理多个客户端连接:
package mainimport ("fmt""net""os"
)func handleConnection(c net.Conn) {// 处理连接defer c.Close()buffer := make([]byte, 1024)for {n, err := c.Read(buffer)if err != nil {fmt.Println("Error reading:", err.Error())return}fmt.Println("Received message:", string(buffer[:n]))_, err = c.Write([]byte("Message received"))if err != nil {fmt.Println("Error writing:", err.Error())return}}
}func main() {// 监听TCP端口listener, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println("Error listening:", err.Error())os.Exit(1)}defer listener.Close()fmt.Println("Listening on 0.0.0.0:8080")for {// 接受新的连接conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting:", err.Error())continue}// 为每个连接启动一个新的goroutinego handleConnection(conn)}
}
在这个例子中,服务器监听8080端口,并为每个接受的连接启动一个新的goroutine。这样,即使服务器正在处理一个连接,它也可以接受新的连接,这就是所谓的多路复用。
5. 注意事项
- 当使用多路复用时,需要小心资源管理,因为每个连接都会消耗内存和其他系统资源。
- 应当合理地限制goroutine的数量,避免过多的goroutine导致系统资源耗尽。
- 考虑使用连接池或者负载均衡来进一步优化资源使用。
通过这种方式,Go语言使得网络编程中的多路复用变得简单高效,非常适合构建高性能的网络服务器。
相关文章:
【Go系列】Go语言的网络服务
承上启下 我们既然知道了Go语言的语法,也了解到了Go语言如何协同工作机制。那么对于这样一款天生支持高并发的语言,它的用武之地自然而然的就是网络服务了。我们今天学学如何使用网络服务。 开始学习 Go语言使用网络服务 在Go语言中,使用网…...
CS110L(Rust)
1.Rust 语法总结 数值类型 有符号整数: i8, i16, i32, i64无符号整数: u8, u16, u32, u64 变量声明 声明变量: let i 0; // 类型推断let n: i32 1; // 显式类型声明 可变变量: let mut n 0; n n 1; 字符串 注意,let s: str "Hello world";…...
免费恢复软件有哪些?电脑免费使用的 5 大数据恢复软件
您是否在发现需要的文件时不小心删除了回收站中的文件?您一定对误操作感到后悔。文件永远消失了吗?还有机会找回它们吗?当然有!您可以查看这篇文章,挑选 5 款功能强大的免费数据恢复软件,用于 Windows 和 M…...
Flink History Server配置
目录 问题复现 History Server配置 HADOOP_CLASSPATH配置 History Server配置 问题修复 启动flink集群 启动Histroty Server 问题复现 在bigdata111上执行如下命令开启socket: nc -lk 9999 如图: 在bigdata111上执行如下命令运行flink应用程序 …...
ASPICE过程改进原则:确保汽车软件开发的卓越性能
"在汽车行业中,软件已经成为驱动创新和增强产品功能的核心要素。然而,随着软件复杂性的增加,确保软件质量、可靠性和性能成为了一项严峻的挑战。ASPICE标准的引入,为汽车软件开发提供了一套全面的过程改进框架,以…...
HDU1005——Number Sequence,HDU1006——Tick and Tick,HDU1007——Quoit Design
目录 HDU1005——Number Sequence 题目描述 超时代码 代码思路 正确代码 代码思路 HDU1006——Tick and Tick 题目描述 运行代码 代码思路 HDU1007——Quoit Design 题目描述 运行代码 代码思路 HDU1005——Number Sequence 题目描述 Problem - 1005 超时代码…...
uniapp form表单校验
公司的一个老项目,又要重新上架,uniapp一套代码,打包生成iOS端发布到App Store,安卓端发布到腾讯应用宝、OPPO、小米、华为、vivo,安卓各大应用市场上架要求不一样,可真麻烦啊 光一个表单校验,…...
构建RSS订阅机器人:观察者模式的实践与创新
在信息爆炸的时代,如何高效地获取和处理信息成为了一个重要的问题。RSS订阅机器人作为一种自动化工具,能够帮助我们从海量信息中筛选出我们感兴趣的内容。 一、RSS 是什么?观察者模式又是什么? RSS订阅机器人是一种能够自动订阅…...
芯片基础 | `wire`类型引发的学习
在Verilog中,wire类型是一种用于连接模块内部或模块之间的信号的数据类型。wire类型用于表示硬件中的物理连线,它可以传输任何类型的值(如0、1、高阻态z等),但它在任何给定的时间点上只能有一个确定的值。 wire类型通…...
如何在AWS上构建Apache DolphinScheduler
引言 随着云计算技术的发展,Amazon Web Services (AWS) 作为一个开放的平台,一直在帮助开发者更好的在云上构建和使用开源软件,同时也与开源社区紧密合作,推动开源项目的发展。 本文主要探讨2024年值得关注的一些开源软件及其在…...
Quartus II 13.1添加新的FPGA器件库
最近需要用到Altera的一款MAX II 系列EPM240的FPGA芯片,所以需要给我的Quartus II 13.1添加新的器件库,在此记录一下过程。 1 下载所需的期间库 进入Inter官网,(Altera已经被Inter收购)https://www.intel.cn/content…...
【html】html的基础知识(面试重点)
一、如何理解HTML语义化 1、思考 A、在没有任何样式的前提下,将代码在浏览器打开,也能够结构清晰的展示出来。标题是标题、段落是段落、列表是列表。 B、便于搜索引擎优化。 2、参考答案 A、让人更容易读懂(增加代码可读性)。 B、…...
Java 网络编程(TCP编程 和 UDP编程)
1. Java 网络编程(TCP编程 和 UDP编程) 文章目录 1. Java 网络编程(TCP编程 和 UDP编程)2. 网络编程的概念3. IP 地址3.1 IP地址相关的:域名与DNS 4. 端口号(port)5. 通信协议5.1 通信协议相关的…...
STM32 | 看门狗+RTC源码解析
点击上方"蓝字"关注我们 作业 1、使用基本定时7,完成一个定时喂狗的程序 01、上节回顾 STM32 | 独立看门狗+RTC时间(第八天)02、定时器头文件 #ifndef __TIM_H#define __TIM_H#include "stm32f4xx.h"void Tim3_Init(void);void Tim7_Init(void);…...
filebeat,kafka,clickhouse,ClickVisual搭建轻量级日志平台
springboot集成链路追踪 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from…...
Django实战项目之进销存数据分析报表——第一天:Anaconda 环境搭建
引言 Anaconda是一个流行的Python和R语言的发行版,它包含了大量预安装的数据科学、机器学习库和科学计算工具。使用Anaconda可以轻松地创建隔离的环境,每个环境都可以有自己的一套库和Python版本,非常适合多项目开发。本文将指导你如何安装A…...
Linux部署Prometheus+Grafana
【Linux】PrometheusGrafana 一、Prometheus(普罗米修斯)1、Prometheus简述2、Prometheus特点3、Prometheus生态组件4、Prometheus工作原理 二、部署Prometheus1、系统架构2、部署Prometheus3、修改配置文件4、配置系统启动文件 三、部署 Node Exporter …...
【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列预测|附代码数据
全文链接:https://tecdat.cn/?p37019 分析师:Haopeng Li 随着我国股票市场规模的不断扩大、制度的不断完善,它在金融市场中也成为了越来越不可或缺的一部分。 【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列…...
低代码前端框架Amis全面教程
什么是Amis? 1.1 Amis的基本概念 Amis是一个基于JSON配置的前端低代码框架,由百度开源。它允许开发者通过简单的JSON配置文件来生成复杂的后台管理页面,从而大大减少了前端开发的工作量。Amis的核心理念是通过配置而非编码来实现页面的构建…...
Windows 如何安装和卸载 OneDrive?具体方法总结
卸载 OneDrive 有人想问 OneDrive 可以卸载吗?如果你不使用当然可以卸载,下面是安装和卸载 OneDrive 中的卸载应用具体操作步骤: 卸载 OneDrive 我们可以从设置面板中的应用选项进行卸载,打开设置面板之后选择应用,然…...
c# .net core中间件,生命周期
某些模块和处理程序具有存储在 Web.config 中的配置选项。但是在 ASP.NET Core 中,使用新配置模型取代了 Web.config。 HTTP 模块和处理程序如何工作 官网地址: 将 HTTP 处理程序和模块迁移到 ASP.NET Core 中间件 | Microsoft Learn 处理程序是…...
Spring后端框架复习总结
之前写的博客太杂,最近想把后端框架的知识点再系统的过一遍,主要是Spring Boot和Mybatis相关,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点可以参考之前写java后端专栏,这篇不再赘述。 目录 Spring什么是AOP?底层原理?事务…...
基于Llama Index构建RAG应用
前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,本文参与活动是2024 DataWhale AI夏令营;😲 在本文中作者将通过: Gradio、Streamlit和LlamaIndex介绍 LlamaIndex 构…...
SSLRec代码分析
文章目录 encoder-models-general_cfautocf.py data_utilsdata_handler_general_cf.py输入输出说明使用方法 trainertuner.py encoder-models-general_cf autocf.py import torch as t # 导入PyTorch并重命名为t from torch import nn # 从PyTorch导入神经网络模块 import …...
第四节shell条件测试(1)(2)
一,命令执行结果判定 &&在命令执行后如果没有任何报错时会执行符号后面的动作 ||在命令执行后如果命令有报错会执行符号后的动作 示例: vim lee.sh #!/bin/bash ls /mnt/file &> /dev/null &&{echo /mnt/filr is not existecho no }||{echo /mnt/fi…...
申请https证书的具体流程
申请HTTPS证书的具体流程通常涉及以下步骤,不过请注意,具体细节可能因不同的证书颁发机构(CA)而有所差异: 1、确定证书类型: 证书类型:根据需求选择合适的SSL证书类型。常见的有DV(…...
IP溯源工具--IPTraceabilityTool
工具地址:xingyunsec/IPTraceabilityTool: 蓝队值守利器-IP溯源工具 (github.com) 工具介绍: 在攻防演练期间,对于值守人员,某些客户要求对攻击IP都进行分析溯源,发现攻击IP的时候,需要针对攻击IP进行分析…...
字节抖音电商 后端开发岗位 一面
笔者整理答案,以供参考 自我介绍 项目(20分钟) RocketMQ延时消息的底层实现 回答: 延时消息的实现主要依赖于RocketMQ中的定时任务机制。消息被发送到Broker时,会先存储在一个特定的延时消息队列中。Broker会定时扫…...
前端开发日记——在MacBook上配置Vue环境
前言 大家好,我是来自CSDN的寄术区博主PleaSure乐事。今天是开始学习vue的第一天,我使用的编译器是vscode,浏览器使用的是谷歌浏览器,后续会下载webstorm进行使用,当前学习阶段使用vscode也是可以的,不用担…...
测试开发面经总结(三)
TCP三次握手 TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态 客户端会随机初始化序号&…...
淄博桓台网站建设公司/百度推广登录
转载注明出处:简书-十个雨点 这篇文章教你如何帮助用户自动接听或者挂断来电。当然并不是我原创的代码,我只不过是把stackoverflow上的一些代码整合了一下,做个代码的二传手。 源码 AcceptOrRejectCallDemo 源码中用了MVP的模式,只…...
直播是网站怎么做/今天的重要新闻
getchar()的用法,部分内容参考百度百科 getchar()函数功能是从stdio中读字符 注:getchar有一个int型的返回值,当程序调用getcahr时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回…...
网站建设和网络营销/优化排名推广技术网站
填充每个节点的下一个右侧节点指针II 题目描述: struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下&…...
青岛知名网站建设公司/三叶草gy5987
ARPA Internet上的主机被要求采用并实现此标准。 介绍 TELNET Protocol的目的是提供一个相对通用的,双向的,面向八位字节的通信方法。它主要的目标是允许接口终端设备的标准方法和面向终端的相互作用。可以预见到,此协议也可被用于终端到终端…...
手机网站建设的背景/沈阳网站优化
我 找了好久原来是个低级错误,在copy的时候不小心的缘故 <hibernate-mapping package"com.strive.entity"> <class name"Dept" table"Dept"><id name"deptno" column"deptno" type"integer">…...
设计类专业哪个最好/百度推广优化技巧
正则表达式不仅能找到文本模式,而且能够用新的文本替换掉这些模式。Regex 对象的 sub()方法需要传入两个参数。第一个参数是一个字符串,用于取代发现的匹配。第二个参数是一个字符串,即正则表达式。sub()方法返回替换完成后的字符串。 例如&a…...