news 2026/7/7 23:22:20

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/7/7 21:26:21

软件复用的分类与实现

复用的分类 复用的形式可以分为技术复用和业务复用两大类。技术复用包括代码复用和技术组件复用&#xff1b;业务复用包括业务实体复用、业务流程复用和产品复用。从复用的程度来看&#xff0c;从高到低依次划分为产品复用、业务流程复用、业务实体复用、组件复用、代码复用。 …

作者头像 李华
网站建设 2026/7/7 5:44:22

google服务

“谷歌服务框架”、“谷歌Play服务”和“谷歌商店App”通常被并称为“谷歌三件套”。 它们是谷歌为Android系统提供的核心软件组件&#xff0c;构成了谷歌移动服务&#xff08;GMS&#xff09;的基础。对于绝大多数安卓用户&#xff0c;特别是使用国产手机的用户&#xff0…

作者头像 李华
网站建设 2026/7/7 5:44:45

进程PCB

1. PCB 到底是什么&#xff1f;从代码角度看&#xff0c;PCB 就是内核空间里定义的一个巨大的 C 语言结构体 (Struct)。存放位置&#xff1a;它存在于内核内存区 (Kernel Space)&#xff0c;普通用户程序无法直接读写&#xff0c;只有操作系统核心才能访问。生命周期&#xff1…

作者头像 李华
网站建设 2026/7/7 20:59:37

实战教程:1小时掌握逆向Unity游戏 (共13课时)

逆向不求人&#xff1a;1小时极速打通Unity游戏逆向任督二脉 引言&#xff1a;为什么每个开发者都应该懂点逆向&#xff1f; 在游戏开发的世界里&#xff0c;逆向工程常常被视为一种“神秘技能”。但真相是&#xff1a;理解逆向就是理解软件的终极运行逻辑。对于Unity开发者而…

作者头像 李华
网站建设 2026/7/8 0:59:58

[从零构建操作系统]08 函数调用时栈的底层行为解析

第一步&#xff1a;在 kernel_init 里安家&#xff08;黄色区域&#xff09;代码位置&#xff1a; 右上角 kernel_init 函数开头栈图对应&#xff1a; 左侧黄色的 “局部变量和数据”sub $0x10, %esp动作&#xff1a; 也就是把栈顶指针 esp 往下拉 16 个字节&#xff0c;给 ker…

作者头像 李华
网站建设 2026/7/7 5:12:42

力扣hot100:搜索插入位置

题目描述&#xff1a;题目分析&#xff1a;本题是一个二分查找&#xff0c;核心思路是通过计算中心点和目标值的大小关系&#xff0c;以此在一个while循环里不断更新左右端点&#xff0c;知道左端点大于右端点。代码&#xff1a;class Solution {public int searchInsert(int[]…

作者头像 李华