Go语学习笔记 - 环境安装、接口测试 | Web框架Gin(一)

简介: Go语学习笔记 - 环境安装、接口测试 | Web框架Gin(一)

学习笔记,写到哪是哪。


基础语法差不多了,需要开始实践到一下项目,先来web框架gin吧,做一个后端web服务。


在把项目搭建起来的过程中,我也要结合实际的工作经验,补充一些项目结构、开发组件上的理解。


项目地址:github地址


gin安装

先将gin安装一下,安装依赖go语言还是比较方便的。


在安装之前先配置一下goproxy。


命令如下:


go env -w GO111MODULE=on

go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/   //阿里代理

go env -w GOPROXY=https://goproxy.cn   //七牛云代理

安装一下gin,命令如下:


go get github.com/gin-gonic/gin

Get请求测试

实现一个web服务还是比较简单的,创建一个router,绑定路由规则即可。先测试几个Get请求。


样例代码如下:


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  router := gin.Default()
  router.GET("/", func(context *gin.Context) {
  context.String(http.StatusOK, "hello world")
  })
  router.GET("/test/:name", func(context *gin.Context) {
  name := context.Param("name")
  context.String(http.StatusOK, "check param %s", name)
  })
  router.GET("/test1", func(context *gin.Context) {
  name := context.DefaultQuery("name", "张三")
  gender := context.Query("gender")
  context.String(http.StatusOK, "他叫%s,性别:%s", name, gender)
  })
  router.Run(":8080")
}

执行结果


[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.

- using env:   export GIN_MODE=release

- using code:  gin.SetMode(gin.ReleaseMode)


[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)

[GIN-debug] GET    /test/:name               --> main.main.func2 (3 handlers)

[GIN-debug] GET    /test1                    --> main.main.func3 (3 handlers)

[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.

Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.

[GIN-debug] Listening and serving HTTP on :8080


[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend yo

u to set a value.

Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-

proxies for details.

[GIN-debug] Listening and serving HTTP on :8080


测试一下,这里我是用的接口测试工具为ApiPost

image.png


image.png


image.png



注意


1、在使用context.DefaultQuery方法的时候,可以提供一个默认值。


2、除了可以使用":"来获取路径参数外,可以使用"*",可以匹配更多规则。我个人感觉我不会这么用get请求参数。


Post请求测试

Post请求是在项目中使用的比较多的,而且不管是使用form获取参数还是body,都十分常见。


同时返回的数据也不可能使用一行字符串,实际项目中还是使用json格式居多。


所以下面我使用form参数和body参数实现了一下post测试接口。


完成代码如下


package main
import (
  "encoding/json"
  "fmt"
  "github.com/gin-gonic/gin"
  "io/ioutil"
  "net/http"
)
type Result struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}
//反序列化为结构体对象
func parseJson(a string) Result {
  fmt.Printf("原始字符串: %s\n", a)
  var c Result
  if err := json.Unmarshal([]byte(a), &c); err != nil {
  fmt.Println("Error =", err)
  return c
  }
  return c
}
func main() {
  router := gin.Default()
  router.GET("/", func(context *gin.Context) {
  context.String(http.StatusOK, "hello world")
  })
  router.GET("/test/:name", func(context *gin.Context) {
  name := context.Param("name")
  context.String(http.StatusOK, "check param %s", name)
  })
  router.GET("/test1", func(context *gin.Context) {
  name := context.DefaultQuery("name", "张三")
  gender := context.Query("gender")
  context.String(http.StatusOK, "他叫%s,性别:%s", name, gender)
  })
  router.POST("/testPost", func(context *gin.Context) {
  name := context.PostForm("name")
  nick := context.DefaultPostForm("nick", "leo")
  context.JSON(http.StatusOK, gin.H{
    "status": gin.H{
    "code":    http.StatusOK,
    "success": true,
    },
    "name": name,
    "nick": nick,
  })
  })
  router.POST("/testPost2", func(context *gin.Context) {
  data, _ := ioutil.ReadAll(context.Request.Body)
  fmt.Println(string(data))
  context.JSON(http.StatusOK, gin.H{
    "code": http.StatusOK,
    "data": parseJson(string(data)),
  })
  })
  router.Run(":8080")
}

测试一下testPost和testPost2接口


image.png


image.png


注意


1、使用context.DefaultPostForm方法可以提供一个默认值。


2、可以使用gin.H方法构造json结构返回。


3、将获得打参数反序列化为结构体,这部分的代码使用到之前讲json解析的笔记。


Go语学习笔记 - Json解析 | 从零开始Go语言_剑客阿良_ALiang的博客-CSDN博客_go语言json对象


小结

本篇笔记主要是对gin的简单使用,我希望把这个项目慢慢完善,比如项目结构优化(可以贴合mvc结构)、日志功能、配置文件、数据库操作、缓存操作、高并发设计等等。项目持续升级,从中慢慢熟悉go语言的项目结构。


相关文章
|
7月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
579 4
|
8月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
436 86
|
12月前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
308 22
|
7月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
328 3
|
10月前
|
人工智能 负载均衡 监控
使用 Go 和 Gin 实现高可用负载均衡代理服务器
本文基于Go语言和Gin框架,实现了一个企业级负载均衡代理服务器,支持动态路由、健康检查、会话保持等功能。具备高可用性与高性能,单节点支持100k+ QPS,延迟达亚毫秒级,并提供完整的压力测试方案与优化建议。
313 7
|
11月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
11月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
645 35
|
12月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
328 15
|
12月前
|
Go
Go语言接口的定义与实现
Go 语言的接口提供了一种灵活的多态机制,支持隐式实现和抽象编程。本文介绍了接口的基本定义、实现方式、空接口的使用、类型断言以及接口组合等核心概念,并探讨了接口与 nil 的关系及应用场景。通过示例代码详细说明了如何利用接口提升代码的可扩展性和可测试性,总结了接口的关键特性及其在依赖注入、规范定义和多态调用中的重要作用。
424 14