news 2026/4/15 11:49:53

go构建web服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go构建web服务

构建最简单的HTTP服务

创建HTTP服务仅需几行代码,利用标准库net/http包实现核心功能。建立一个监听8080端口的服务,对所有请求返回"hello, world"响应。

mkdir simple-http-server cd simple-http-server go mod init simple-http-server

main.go中写入以下代码:

packagemainimport"net/http"funcmain(){http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request){w.Write([]byte("hello, world"))})http.ListenAndServe(":8080",nil)}

http.HandleFunc注册路由处理函数,http.ListenAndServe启动服务监听。通过curl测试服务:

curl localhost:8080/

图书管理API服务架构

项目采用模块化设计,分为HTTP服务器和图书存储两大模块。API遵循RESTful风格,支持图书CRUD操作,数据交互使用JSON格式。

创建项目基础结构:

mkdir bookstore cd bookstore go mod init bookstore

项目目录布局:

├── cmd/ │ └── bookstore/ │ └── main.go ├── internal/ │ └── store/ │ └── memstore.go ├── server/ │ ├── middleware/ │ │ └── middleware.go │ └── server.go └── store/ ├── factory/ │ └── factory.go └── store.go

核心模块实现

数据存储模块
通过工厂模式创建存储实例,支持多种存储后端。定义通用接口:

typeBookStoreinterface{Create(*Book)errorUpdate(*Book)errorGet(string)(*Book,error)GetAll()([]*Book,error)Delete(string)error}

内存存储实现示例:

typememStorestruct{sync.RWMutex booksmap[string]*Book}

HTTP服务器模块
封装路由注册和中间件处理:

funcNewBookStoreServer(addrstring,s store.BookStore)*BookStoreServer{srv:=&BookStoreServer{addr:addr,store:s,}router:=mux.NewRouter()router.Use(loggingMiddleware)router.HandleFunc("/book",srv.createBook).Methods("POST")router.HandleFunc("/book/{id}",srv.updateBook).Methods("PUT")returnsrv}

主程序流程
初始化存储和服务器实例,优雅处理服务启停:

funcmain(){s,err:=factory.New("mem")srv:=server.NewBookStoreServer(":8080",s)errChan:=make(chanerror)gofunc(){errChan<-srv.ListenAndServe()}()quit:=make(chanos.Signal,1)signal.Notify(quit,syscall.SIGINT,syscall.SIGTERM)select{caseerr:=<-errChan:log.Printf("Server error: %v",err)case<-quit:ctx,cancel:=context.WithTimeout(context.Background(),5*time.Second)defercancel()srv.Shutdown(ctx)}}

关键实现细节

  1. 使用gorilla/mux实现路由匹配
  2. 中间件处理日志记录和异常恢复
  3. 内存存储使用读写锁保证并发安全
  4. 响应编码统一采用JSON格式
  5. 实现优雅停机机制

示例API请求:

POST /book Content-Type: application/json {"id":"978-3-16-148410-0","name":"Go语言设计模式","authors":["张三"],"press":"人民邮电出版社"}

响应处理逻辑:

func(bs*BookStoreServer)createBook(w http.ResponseWriter,req*http.Request){varbook store.Bookiferr:=json.NewDecoder(req.Body).Decode(&book);err!=nil{http.Error(w,err.Error(),http.StatusBadRequest)return}iferr:=bs.store.Create(&book);err!=nil{http.Error(w,err.Error(),http.StatusInternalServerError)return}w.WriteHeader(http.StatusCreated)}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 4:08:14

Go语言变量

Go变量声明的核心机制 静态类型语言要求变量在使用前必须声明&#xff0c;明确内存边界。Go作为静态语言&#xff0c;通过变量声明实现这一机制&#xff1a; 变量绑定特定内存区域&#xff0c;类型信息确定操作边界声明形式为&#xff1a;var 变量名 类型 值未显式初始化时自动…

作者头像 李华
网站建设 2026/4/15 9:21:49

【高可用系统架构】

系统高可用实现手段 冗余与无单点设计 部署关键节点时避免单点故障&#xff0c;例如负载均衡采用双节点Keepalived方案&#xff08;如Nginx/HAProxy/LVS&#xff09;&#xff0c;通过虚拟IP实现故障自动切换。网络通信配置多线路&#xff08;如移动电信双线&#xff09;&#x…

作者头像 李华
网站建设 2026/4/15 11:16:12

高频软件测试基础面试题

在软件测试的面试过程中&#xff0c;面试官会问些基础的软件测试知识&#xff0c;下面为大家整理了一些高频软件测试面试必备的基础题&#xff0c;拿走不谢~ 一、什么是软件测试 为了发现程序中的错误而执行程序的过程。 二、软件测试的原则 1、完全测试程序是不可能的 2、…

作者头像 李华
网站建设 2026/4/14 2:46:57

如何准确判断json文件并且拿到我想要的信息

写在前面&#xff0c;自从发现拿到json解析后的文件中有我们想要的信息后&#xff0c;我稍微有点迷上这种方法&#xff0c;但是拿到内容后要怎么拿到想要的信息呢&#xff0c;字典列表相互嵌套&#xff0c;我头都晕了方法&#xff1a;首先就是把json解析后的文本保存成.json的形…

作者头像 李华
网站建设 2026/4/14 19:09:26

C++进阶技巧:如何在同一对象中存储左值或右值

一、背景C 代码似乎经常出现一个问题&#xff1a;如果该值可以来自左值或右值&#xff0c;则对象如何跟踪该值&#xff1f;即如果保留该值作为引用&#xff0c;那么就无法绑定到临时对象。如果将其保留为一个值&#xff0c;那么当它从左值初始化时&#xff0c;会产生不必要的副…

作者头像 李华
网站建设 2026/4/3 21:21:44

【Arduino Uno】数码管模拟值实验

目录 一.1位数码管模拟值1.共阳极数码管实验效果2.共阳极与共阴极数码管原理与构造数码管内部构造 3.需要的组件4.共阳极数码管接线图5.共阳极代码阳极代码调换为阴极 6.优化代码补充说明 7.总结 一.1位数码管模拟值 1.共阳极数码管实验效果 数码管模拟值实验共阳极2.共阳极与…

作者头像 李华