#### 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个\n",len(os.Args))
for i,v := range os.Args {
fmt.Printf("当前是第%d个参数,参数是%s\n",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\n",username)
fmt.Printf("password=%s\n",password)
fmt.Printf("host=%s\n",host)
fmt.Printf("username=%s\n",username)
fmt.Printf("port=%d\n",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()
}

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

Go 命令行参数,JSON 序列化与反序列化的更多相关文章

  1. go语言之行--文件操作、命令行参数、序列化与反序列化详解

    一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...

  2. 命令行参数 && json 协议 && 自定义 error 类型

    命令行参数 在写代码的时候,在运行程序做一些初始化操作的时候,往往会通过命令行传参数到程序中,那么就会用到命令行参数 例如,指定程序运行的模式和级别: go run HTTPServer.go --m ...

  3. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  4. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  5. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  6. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  7. Net中JSON序列化和反序列化处理(日期时间特殊处理)

    0  缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...

  8. Appium 服务命令行参数

    Appium  可以直接通过命令行启动,同样支持命令行参数配置 参考: http://appium.io/slate/cn/master/ 使用方法 例如: appium  --shell 服务器标志 ...

  9. 让browserify接收命令行参数,在打包时parse yml配置文件

    功能需求: 1用browserify把各种js打包成浏览器端的1个bundle.js,含有yml配置文件 约束: 1 yml配置文件不在当前工程里(现在还不知道放哪里,以后也会变),希望在打包时,用命 ...

随机推荐

  1. 使用docker自定义oraclejdk启动jar包

    Dockerfile文件 FROM centos:7 #把java与tomcat添加到容器中 ADD jdk-8u161-linux-x64.tar.gz /usr/local/ #安装 vim编辑器 ...

  2. This request has been blocked; the content must be served over HTTPS.处理方案

    在页面head标签中加入 <meta http-equiv="Content-Security-Policy" content="upgrade-insecure- ...

  3. c++之面试题(1)

    题目 有十瓶药,每瓶里都装有100片药,其中有八瓶里的药每片重10克,另有两瓶里的药每片重9克.用一个蛮精确的小秤,只称一次,如何找出份量较轻的那两个药瓶? 解法 1.分别给10个药瓶按照斐波那契数列 ...

  4. 【LeetCode】1402. 做菜顺序 Reducing Dishes

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...

  5. Android 控件使用教程(一)—— ListView 展示图片

    起因 最近在看一些开源项目时,经常看到了RecyclerView,这是安卓5.0推出的一个新的控件,可以代替传统的ListView,已经这么久了还没有用过,所以决定试一试.另外在做这个的工程中看到了另 ...

  6. 【LeetCode】380. Insert Delete GetRandom O(1) 解题报告(Python)

    [LeetCode]380. Insert Delete GetRandom O(1) 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxu ...

  7. 【LeetCode】842. Split Array into Fibonacci Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. 1340 - Story of Tomisu Ghost

    1340 - Story of Tomisu Ghost   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  9. C# RabbitMQ的使用

    本文目的如题. 安装 先说一下RabbitMQ的安装,建议使用Docker镜像安装,Docker安装的好处是不管Windows系统还是Linux,安装步骤少,安装方法相同,不容易出错.使用下面的命令就 ...

  10. Linq和Lambda 性能对比

    Linq和Lambda 性能对比 1.Where() 使用LINQ创建一个简单的where查询 var query = from person in PersonCollection where pe ...