zoukankan      html  css  js  c++  java
  • Go 命令行参数,JSON 序列化与反序列化

    #### Go 命令行参数,JSON 序列,反序列化
    这一节来学习一下Go 如果解析命令行参数,以及JSON 的序列化及反序列化;
    命令行参数对于熟悉Linux 的同学来说比较清楚,如: ls -a , wc -l ... 其中,-a, -l 都是命令行参数;
    JSON 的序列化与反序列化在WEB 开发中很常见的, 这节带领大家学习一下在Go 中如何操作JSON
    ##### 命令行参数
    在Go 中os.Args 是一个字符串切片,存储了所有的命令参数
    package main
    
    import (
       "fmt"
       "os"
    )
    
    func main(){
       fmt.Printf("命令行参数有%d个
    ",len(os.Args))
       for i,v := range os.Args {
          fmt.Printf("当前是第%d个参数,参数是%s
    ",i+1,v)
       }
    }
    

      


    ##### 使用flag 包来解析命令行参数
    上面os.Args 是比较原始的方式解析参数,对于带指定的参数形式,就比较吃力了;
    使用flag 包可以解决这个问题
    package main
    
    import (
       "flag"
       "fmt"
    )
    
    func main()  {
       var username string
       var password string
       var host string
       var port int
       flag.StringVar(&username,"u","","database username ,default empty")
       flag.StringVar(&password,"p","","database password,default empty")
       flag.StringVar(&host,"h","","database host,default empty")
       flag.IntVar(&port,"port",3306,"database host port,default 3306")
       flag.Parse()
       fmt.Printf("username=%s
    ",username)
       fmt.Printf("password=%s
    ",password)
       fmt.Printf("host=%s
    ",host)
       fmt.Printf("username=%s
    ",username)
       fmt.Printf("port=%d
    ",port)
       // ./main.exe -u root -p 1201 -h 127.0.0.1 -port 33306
       //username=root
       //password=1201
       //host=127.0.0.1
       //username=root
       //port=33306
    }
    

      


    ##### JSON 序列化
    JSON 的全称为JavaScript Object Notation ,它是一种轻量级的数据交换格式;
    在JS 中一切皆对象,所以任何的数据类型都可以用JSON 来表示: 如Go 中的字符串,数组,切片,map,结构体等;
    JSON 的序列化是指将有key-value 结构的数据类型(如结构体,map,切片)序列化成JSON 字符串的操作
    package main
    
    import (
       "encoding/json"
       "fmt"
    )
    
    // 如果需要序列化后的key 名自定义,需要使用tag
    type Person struct {
       Name string `json:"username"`
       Age  int    `json:"person_age"`
       // 对于结构体内不能导出字段
       // 首字母小写的
       // 无法序列化
       extra string
    }
    func marshal(data interface{}) {
       body, err := json.Marshal(data)
       if err != nil {
          fmt.Println(err)
          fmt.Println("序列化失败")
          return
       }
       fmt.Print("序列化后的数据为:")
       fmt.Println(string(body))
    
    }
    func structToJSON() {
       person := Person{"Tom",
          21,
          "i want be a teacher"}
       marshal(person)// {"username":"Tom","person_age":21}
    }
    func mapToJSON() {
       person := make(map[string]interface{})
       person["name"] = "Jack"
       person["age"] = 20
       person["extra"] = "i want play game"
       marshal(person) // {"age":20,"extra":"i want play game","name":"Jack"}
    }
    func sliceToJSON(){
       person := make([]string,0)
       person = append(person,"Tom")
       person = append(person,"Jack")
       person = append(person,"hey")
       marshal(person) // ["Tom","Jack","hey"]
    }
    func main() {
       structToJSON()
       mapToJSON()
       sliceToJSON()
    }
    

      


    ##### JSON 反序列化
    JSON 反序列化是指将 JSON 字符串序列化成对应的数据类型(结构体,map,切片)的操作
    package main
    
    import (
       "encoding/json"
       "fmt"
    )
    
    func unmarshalMap(){
       str := `{"name":"tom","age":21,"extra":"i am english teacher"}`
       var person map[string]interface{}
       err := json.Unmarshal([]byte(str),&person)
       if err != nil {
          fmt.Println("JSON 反序列化失败")
          fmt.Println(err)
          return
       }
       fmt.Print("序列化的结果为:")
       fmt.Println(person) //map[age:21 extra:i am english teacher name:tom]
    }
    func unmarshalSlice(){
       str := `["tom","jack","hey","joy"]`
       var person []string
       err := json.Unmarshal([]byte(str),&person)
       if err != nil {
          fmt.Println("JSON 反序列化失败")
          fmt.Println(err)
          return
       }
       fmt.Print("序列化的结果为:")
       fmt.Println(person) //[tom jack hey joy]
    }
    
    func unmarshalStruct(){
       str := `{"name":"tom","age":21,"extra":"i am english teacher"}`
       var person struct{
          Name string
          Age int
          // 反序列化也一样,如果是不可导出字段
          // 则不能反序列化
          extra string
       }
       err := json.Unmarshal([]byte(str),&person)
       if err != nil {
          fmt.Println("JSON 反序列化失败")
          fmt.Println(err)
          return
       }
       fmt.Print("序列化的结果为:")
       fmt.Println(person) //{tom 21 }
    }
    func main(){
       unmarshalMap()
       unmarshalStruct()
       unmarshalSlice()
    }
    

      最新文章在个人微信公众号,欢迎关注, 一同交流学习;

  • 相关阅读:
    使用docker搭建nginx集群,实现负载均衡
    机器重启以后,主从出现报错:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repos
    Slave_SQL_Running: No mysql同步故障解决方法
    docker搭建MySQL主从集群
    Linux下如何查看版本信息
    Docker中使用CentOS7镜像
    在 CentOS 上安装及使用 VirtualBox
    Docker Machine 安装使用教程
    main主函数
    is and ==
  • 原文地址:https://www.cnblogs.com/Mail-maomao/p/11555161.html
Copyright © 2011-2022 走看看