青训营笔记3 | 豆包MarsCode AI刷题

118 阅读3分钟

GO-GIN学习

三、gin框架返回json

方法一:映射和gin.H

package main

import (
    "net/http"

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

func main(){

    r:= gin.Default()

    r.GET("/json",func(c *gin.Context){
        //方法一:使用map
        data:= map[string]interface{}{
            "name":"Leeson",
            "message":"from Cambridge",
            "age":24,
        }
        c.JSON(http.StatusOK,data)
    })

    r.Run(":9090")
}

结果反应在图片5,就是返回一串json格式的数据

//方法1其他写法:gin.H
        data := gin.H{
            "name":"Leeson",
            "message":"from Cambridge",
            "age":24,
        }

这个H是一个type,就是上面方法1一样的结果。

方法二:定义结构体(项目常用)

//方法二:结构体
    type msg struct {
        Name    string
        Message string
        Age     int
    }

    r.GET("/json2", func(c *gin.Context) {
        data := msg{
            "fhq",
            "lab",
            999999,
        }

        c.JSON(http.StatusOK, data)
    })

返回结果:

{
    "Name": "fhq",
    "Message": "lab",
    "Age": 999999
}

最后一个没有逗号。

而且结构体里面的变量必须必须是首字母大写的!!!!否则会丢失!

因为json的序列化,默认是使用go语言标准库的,反射取值,go里面函数方法啥的有首字母小写会导致无法导出,相当于没有这个字段。

如果一定要返回小写,那么就要用tag,进行自定义,json的包做反射操作。

//方法二:结构体 灵活使用tag来做定制化操作
    type msg struct {
        Name    string `json:"name"`
        Message string
        Age     int
    }

    r.GET("/json2", func(c *gin.Context) {
        data := msg{
            "fhq",
            "lab",
            999999,
        }

        c.JSON(http.StatusOK, data)
    })

注意,这里是反引号哦,单引号是不对的。

在Go语言中,结构体字段的标签需要使用反引号(`)而不是单引号(')。

在Go语言中,反引号(`)是一种用于表示原始字符串的字符。使用反引号定义的字符串会保留其原始格式,其中包含的任何特殊字符和转义序列都会被直接输出。例如:

``str := `Hello\nWorld```

fmt.Println(str)

以上代码输出的结果是:

Hello\nWorld

可以看到,使用反引号定义的字符串中的\n并没有被转义成一个换行符,而是直接输出了它本身。

在Go语言中,反引号还被广泛用于定义结构体字段标签,如我之前所提到的。反引号可以让开发者自定义结构体字段的元数据,例如字段的名称、长度、类型等等,这些元数据可以在后续的代码中被读取和使用。



四、gin获取querystring参数

https://www.sogou.com/web?query=%E9%87%8C%E6%A3%AE

搜索是额外附加信息。问号前面是我们的url,问号+什么等于什么的格式

package main

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

func main(){
    r := gin.Default()

    r.GET("/web",func(c *gin.Context){
        //获取浏览器那边发请求携带的 query string 参数
        c.JSON(http.StatusOK,"ok")
    })

    r.Run(":9090")
}

得到:

"ok"

如果写入为127.0.0.1:9090/web?query=里森返回还是ok,这个时候我们需要的到里森的相关结果

修改:

    r.GET("/web",func(c *gin.Context){
        //获取浏览器那边发请求携带的 query string 参数
        name := c.Query("query")  
        //通过Query获取请求中携带的querystring参数
        c.JSON(http.StatusOK,gin.H{
            "name": name,

        })
    })

可以得到的是格式下各种输入对应的H形式,比如:

{
    "name": "里森"
}
{
    "name": "泥电"
}

还可以添加默认值,如果查不到,就显示替换的默认值,这里是somebody。

name := c.DefaultQuery("query","somebody")  //娶不到就用指定的默认值

第三种就是用getquery,因为这个函数会返回一个布尔值,就用ok来接收,如果接收不到布尔值,就false然后做下面if,返回指定的默认值。

name,ok := c.GetQuery("query")
if !ok {
    //取不到
    name ="somebody"
}

开始叠加(运用英文的and符号也就是&)

9090/web?query=里森&age=23

代码修改为:

>     r := gin.Default()
>
>     // GET请求 URL ?后面的是querystring参数
>     // key=value格式,多个key-value用 & 链接
>     // eq : /web?query=xxxxxx&age=xxx
>
>     r.GET("/web",func(c *gin.Context){
>         //获取浏览器那边发请求携带的 query string 参数
>         name := c.Query("query")  
>         age := c.Query("age")
>         //通过Query获取请求中携带的querystring参数
>         //name := c.DefaultQuery("query","somebody") 
>         /*name,ok := c.GetQuery("query")
>         if !ok {
>             //取不到
>             name ="somebody"
>         }*/
>
>         c.JSON(http.StatusOK,gin.H{
>             "name": name,
>             "age":age,
>         })
>     })
>
>     r.Run(":9090")
> ```
>
> 那么显示:返回出来注意是无序的。
>
> ```
> {
>     "age": "23",
>     "name": "里森"
> }