Go语言学习之Struct中的Tag

简介

Tag可选的字段:

  • "-" :不要解析这个字段
  • "omitempty":当字段为空(默认值)时,不要解析这个字段;比如是false、0、nil或者长度为0的array、map、slice、string等
  • FieldName:当解析json、xml、ini等的时候 用这个名字

YAML配置文件和Struct Tag的结合使用

一、新建YAML配置文件

######config.yaml########

http:
  port: 8090
  domain: baidu
  secretKey: test

二、在程序中使用配置文件获取参数‘

package config

import (
    "fmt"
    "gopkg.in/yaml.v2"
    "io/ioutil"
)

//Config和Http 为嵌套关系
type Config struct {
    Http         `yaml:"http"`
}

type Http struct {
    Port    string    `yaml:"port"`
    Secret  string    `yaml:"secretKey"`
    Domain    string  `yaml:"domain"`
}


func  Init() *Config {
  //初始化Config 结构体 Conf :
= new(Config)
//读取配置文件 yamlFile, err :
= ioutil.ReadFile("config.yaml") if err != nil { fmt.Println(err.Error()) }
  //把YAML配置文件和Config结构体绑定,一对一映射,因为结构体的别名(yaml:port,yaml:secretKey,yaml:domain和YAML配置文件里的Key是一样的,所以能一对一映射上,把YAML配置文件的值赋值给结构体) err
= yaml.Unmarshal(yamlFile, Conf)
  //通过打印Config这个结构的Key能获取通过YAML配置文件映射的值 fmt.Println(Conf.Domain,Conf.Port,Conf.Secret)
if err != nil { fmt.Println(err.Error()) } return Conf
##########结果
baidu 8090 test

JSON和Struct Tag结合使用

不加Json Tag

package main

import (
    "encoding/json"
    "fmt"
)

type peerInfo struct {
    HTTPPort int
    TCPPort  int
    versiong string
}

func main() {
  //实例化结构体 pi :
= peerInfo{80, 3306, "0.0.1"}
  // 把p1结构体给转换成json js, err :
= json.Marshal(pi) if err != nil { fmt.Println(err) }
  //打印转换成json之后的结构体 fmt.Println(
string(js)) }

输出结果

{"http_port":80,"tcp_port":3306}

加Json Tag

type NetConf struct {
    Master string `json:"master"`
    Mode   string `json:"mode"`
    MTU    int    `json:"mtu"`
    Debug  bool   `json:"debug"`
}

func main() {
    //实例化结构体,就是给结构体赋值
    n := NetConf{"master1", "mode1", 1500, true}
    //把结构体转换成json
    if d,e:=json.Marshal(n);e==nil{
        fmt.Println(string(d))
    }
}

输出结果

{"master":"master1","mode":"mode1","mtu":1500,"debug":true}

Json配置文件和Struct Tag结合

一、新建json配置文件

config.json

{
  "enabled": true,
  "path": "/usr/local"
}

程序读取JSON配置文件并和struct绑定

type configuration struct {
    Enabled bool    `json:"enabled"`  //必须跟配置文件里的Key一样,否则无法映射
    Path    string    `json:"path"`
}

func main() {
        //读取配置文件
        file, _ := os.Open("config.json")
    defer file.Close()
        //NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据
    decoder := json.NewDecoder(file)
        //实例化结构体
    conf1 := configuration{}
        //Decode从输入流读取下一个json编码值并保存在结构体里
    if erre := decoder.Decode(&conf1); erre != nil {
        fmt.Println(erre)
    }

       //打印结构体的属性,json已经把从配置文件读取出来的值绑定到结构体对应的值上了
    fmt.Println(conf1.Enabled)
    fmt.Println(conf1.Path)
} 

Echo框架Post参数结合结构体Tag使用

echo框架读取Post的参数,并把值绑定到结构体

main.go

package main
import (

    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"


)



func main(){
    

    e := echo.New()
    e.Use(middleware.Logger())  //开启Log日志
    e.Use(middleware.Recover())  //Recover 中间件从 panic 链中的任意位置恢复程序, 打印堆栈的错误信息,并将错误集中交给 HTTPErrorHandler 处理
    e.Use(middleware.RequestID()) //为请求生成唯一的 ID
    e.POST("/login",auth.Login)
    e.Start(":8080")


}

login.go

package auth

import (
    "github.com/labstack/echo"
    "net/http"

)

type User struct {
    Name  string `json:"name" form:"name" query:"name"`   //这里的tag表示,json不用说了, 然后form是可以跟POst请求中form表单里的name字段可以绑定,query可以跟query参数绑定,就是get请求
    Password string `json:"password" form:"password" query:"password"`
}

func Login(c echo.Context) (err error){
//为User 结构体分配内存 u :
= new(User)
//把从Post请求读取过来的值绑定到结构体里
if err = c.Bind(u); err != nil { cuowu := "cuowu" return c.String(http.StatusBadGateway,cuowu) }
fmt.Println(u.Name,u.Password)
return c.String(http.StatusOK,u.Name) }

测试,发送Post请求

 

 查看程序的执行结果

admin
xxx

 

posted @ 2020-12-09 18:13  差点点温柔  阅读(2049)  评论(0编辑  收藏  举报