Go学习笔记二——windows下使用Gin

Gin 是一个用 Go (Golang) 编写的 web 框架

它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json

go的版本

配置环境变量

set GO111MODULE=on
set GOPROXY=https://goproxy.io

初始化

go mod init  demo

获取Gin

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

1.简单例子

入口文件main.go

复制代码
package main

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

func main() {
    r := gin.Default()
    r.GET("/test", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

运行

go run main.go

浏览器访问http://localhost:8080/test

返回

{"message":"hello"}

Gin是一个轻量级的 WEB 框架

  支持 RestFull 风格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上传,分组路由,Multipart/Urlencoded FORM,支持 JsonP,参数处理

2.修改启动方式

默认启动方式,包含 Logger、Recovery 中间件

r := gin.Default()

请求接口会输出日志

无中间件启动

r := gin.New()

 请求接口不再输出日志

3.日志写入文件

复制代码
package main

import (
    "io"
    "os"
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {

    gin.DisableConsoleColor()

    // 创建记录日志的文件
    f, _ := os.Create("gin.log")
    gin.DefaultWriter = io.MultiWriter(f)
    // 如果需要将日志同时写入文件和控制台,请使用以下代码
    // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
    r := gin.Default()

    r.GET("/test", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

启动

以前输出的都写入和main.go在同一目录下的gin.log中

4.静态资源

  StaticFile 是加载单个文件

  StaticFS 是加载一个完整的目录资源

复制代码
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))
    r.StaticFile("/favicon.ico", "./favicon.ico")
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

5.上传文件

  单文件

复制代码
package main

import (
    "log"
    "path"
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))
    r.GET("/test", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })
    r.POST("/upload", func(c *gin.Context) {
        // 单文件
        file, _ := c.FormFile("file")
        log.Println(file.Filename)
        dst := path.Join("./static/upload", file.Filename)
        // 上传文件至指定目录
        c.SaveUploadedFile(file, dst)
        c.JSON(200, gin.H{
            "message": file.Filename+" uploaded!",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

测试

  多文件

复制代码
package main

import (
    "log"
    "path"
    "strconv"
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))
    r.GET("/test", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })

    r.POST("/upload", func(c *gin.Context) {
        // 多文件
        form, _ := c.MultipartForm()
        files := form.File["files[]"]

        for _, file := range files {
            log.Println(file.Filename)
            dst := path.Join("./static/upload", file.Filename)
            // 上传文件至指定目录
            c.SaveUploadedFile(file, dst)
        }

        c.JSON(200, gin.H{
            "message":  strconv.Itoa(len(files))+" uploaded!",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

测试

6.获取参数

(1)获取路径中的参数

复制代码
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()

    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))

    r.GET("/test/:firstname/:lastname", func(c *gin.Context) {
        firstname := c.Param("firstname")
        lastname := c.Param("lastname")
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
            "firstname":firstname,
            "lastname":lastname,
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

测试

(2)获取GET参数

c.Query 解析?后的参数,eg: key1=value2&key2=value2

c.DefaultQuery 处理默认参数

复制代码
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()

    r.GET("/test", func(c *gin.Context) {
        firstname := c.DefaultQuery("firstname", "Guest")
        lastname := c.Query("lastname")
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
            "firstname":firstname,
            "lastname":lastname,
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

测试

(3)获取post参数

c.PostFROM 解析的是  x-www-form-urlencoded 或 from-data 的参数

c.DefaultPostForm 处理默认参数

复制代码
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()

    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))

    r.POST("/test", func(c *gin.Context) {
        firstname := c.DefaultPostForm("firstname", "Guest")
        lastname :=  c.PostForm("lastname")
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
            "firstname":firstname,
            "lastname":lastname,
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
复制代码

测试

 

posted @   慕尘  阅读(1363)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-07-12 redis的有序集合ZSET(stored set)
2017-07-12 redis 的set数据类型
2017-07-12 redis 的hash数据类型
点击右上角即可分享
微信分享提示