gin基本操作

gin

安装使用

go get -u github.com/gin-gonic/gin

// 导入
import "github.com/gin-gonic/gin"

路由传参

  • 无参路由

  • API参数

  • URL参数

    package main
    
    import (
    	"fmt"
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func demoGin1(c *gin.Context) {
    	c.String(http.StatusOK, "lalala")
    }
    
    func demoGin2(c *gin.Context) {
    	// 通过param参数来获取方法
    	Id := c.Param("id")
    	c.String(http.StatusOK, fmt.Sprintf("id is %v", Id))
    }
    
    func demoGin3(c *gin.Context) {
    	username := c.DefaultQuery("name", "xxx") //参数不存在,会返回默认值xxx
    	username2 := c.Query("name")              // 参数不存在,就返回空字符串
    	c.String(http.StatusOK, fmt.Sprintf("default query is:%#v \nquery is: %#v\n", username, username2))
    }
    
    func main() {
    	r := gin.Default()
    	r.GET("/lalala", demoGin1)   // 无参数路由 http://127.0.0.1:8089/lalala
    	r.GET("/test/:id", demoGin2) // api 参数 http://127.0.0.1:8089/test/21
    	r.GET("/query/", demoGin3)   // url 参数 http://127.0.0.1:8089/query?name2=amdimn
    	r.Run(":8089")
    }
    
    

ShouldBind参数绑定

  • 能够基于请求自动提取JSONform表单QueryString类型的数据,并把值绑定到指定的结构体对象。

    package main
    
    import (
    	"fmt"
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    type Login struct {
    	User     string `form:"user" json:"user" binding:"required"`
    	Password string `form:"password" json:"password" binding:"required"`
    }
    
    func demoLogin(c *gin.Context) {
    	var login Login
    	//
    	if err := c.ShouldBind(&login); err != nil {
    		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    	}
    	c.String(http.StatusOK, fmt.Sprintf("姓名:%s -- 密码:%s", login.User, login.Password))
    }
    
    func main() {
    	r := gin.Default()
    	r.POST("/login/", demoLogin)
    	r.Run(":8089")
    }
    
    

响应返回

  • 响应String 用c.String来返回

  • 响应json 用c.Json来返回值,也可以直接用gin.H

  • 响应Xml 用c.XML来返回

  • 响应Yaml 用c.YAML来返回

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    )
    
    // 多种响应方式
    func main() {
    	r := gin.Default()
    	
    	// 1.json
    	r.GET("/someJSON", func(c *gin.Context) {
    		c.JSON(200, gin.H{"message": "someJSON", "status": 200})
    	})
    	
    	// 2. 结构体响应
    	r.GET("/someStruct", func(c *gin.Context) {
    		var msg struct {
    			Name    string
    			Message string
    			Number  int
    		}
    		msg.Name = "root"
    		msg.Message = "message"
    		msg.Number = 123
    		c.JSON(200, msg)
    	})
    	
    	// 3.XML
    	r.GET("/someXML", func(c *gin.Context) {
    		c.XML(200, gin.H{"message": "abc"})
    	})
    	
    	// 4.YAML响应
    	r.GET("/someYAML", func(c *gin.Context) {
    		c.YAML(200, gin.H{"name": "zhangsan"})
    	})
    
    	r.Run(":8089")
    }
    
    

路由重定向

  • c.Redirect 来重定向

    package main
    
    import (
        "net/http"
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        r := gin.Default()
        r.GET("/", func(c *gin.Context) {
            c.Redirect(http.StatusMovedPermanently, "www.baidu.com")
        })
        r.Run()
    }
    

路由分发

  • 路由拆分到多个文件

    demoGin3
    ├── go.mod
    ├── go.sum
    ├── main.go
    └── routers
        ├── user.go
        └── books.go
    
    // main.go
    
    package main
    
    import (
    	"demoGin3/routes"
    	"github.com/gin-gonic/gin"
    )
    
    func main() {
    	r := gin.Default()
    	routes.LoadBooks(r)
    	routes.LoadUsers(r)
    
    	r.Run(":8089")
    }
    
    // routes/books.go
    package routes
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func LoadBooks(e *gin.Engine) {
    	e.GET("/book", GetBookHandler)
    }
    
    func GetBookHandler(c *gin.Context) {
    	c.JSON(http.StatusOK, gin.H{
    		"message": "book route",
    	})
    }
    
    
    // routes/user.go
    package routes
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func LoadUsers(e *gin.Engine) {
    	e.GET("/user", UserHandler)
    }
    
    func UserHandler(c *gin.Context) {
    	c.JSON(http.StatusOK, gin.H{
    		"message": "user route",
    	})
    }
    
  • 路由拆分到app

    gin_demo
    ├── app
    │   ├── app1
    │   │   ├── handler.go
    │   │   └── router.go
    │   └── app2
    │       ├── handler.go
    │       └── router.go
    ├── go.mod
    ├── go.sum
    ├── main.go
    └── routers
        └── routers.go
    
    • routes.go中用include来注册其他app中的路由,Init来初始化

      type Option func(*gin.Engine)
      
      var options = []Option{}
      
      // 注册app的路由配置
      func Include(opts ...Option) {
      	options = append(options, opts...)
      }
      
      // 初始化
      func Init() *gin.Engine {
      	r := gin.Default()
      	for _, opt := range options {
      		opt(r)
      	}
      	return r
      }
      
    • main.go中注册路由,进行初始化

      func main() {
      	// 加载多个APP的路由配置
      	routers.Include(shop.Routers, blog.Routers)
      	// 初始化路由
      	r := routers.Init()
      	if err := r.Run(); err != nil {
      		fmt.Println("startup service failed, err:%v\n", err)
      	}
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Goland中导入Gin,您可以按照以下步骤进行操作: 步骤1:首先,您需要在计算机上安装Golang和Goland。然后,您可以通过打开Goland并创建一个新的Golang项目来开始工作。 步骤2:在Goland中,您需要打开项目的终端或命令提示符,并导航到项目的根目录。 步骤3:在终端中,您可以使用以下命令来初始化一个新的Go模块: ``` go mod init yourmodule ``` 这将创建一个新的Go模块,并为您的项目设置包名称。 步骤4:接下来,您可以使用以下命令来下载并安装Gin包: ``` go get -u github.com/gin-gonic/gin ``` 这将使用Go模块的依赖项管理工具下载和安装Gin包。 步骤5:完成安装后,您可以在代码中导入Gin包并开始使用它。在您的代码文件的顶部,添加以下导入语句: ```go import "github.com/gin-gonic/gin" ``` 步骤6:现在,您可以在代码中使用Gin的各种功能了。例如,您可以创建一个新的Gin引擎,并进行路由设置和请求处理。 例如,以下是一个简单的Gin示例: ```go package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() // 定义路由 r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "Hello, Gin!", }) }) // 启动服务器 r.Run() } ``` 这是一个使用Gin的简单HTTP服务器示例。它创建了一个基本的GET路由,该路由在根路径上返回一个JSON响应。 通过按照以上步骤进行操作,您就可以在Goland中成功导入并使用Gin库了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值