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个\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 序列化与反序列化的更多相关文章
- go语言之行--文件操作、命令行参数、序列化与反序列化详解
一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...
- 命令行参数 && json 协议 && 自定义 error 类型
命令行参数 在写代码的时候,在运行程序做一些初始化操作的时候,往往会通过命令行传参数到程序中,那么就会用到命令行参数 例如,指定程序运行的模式和级别: go run HTTPServer.go --m ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- Appium 服务命令行参数
Appium 可以直接通过命令行启动,同样支持命令行参数配置 参考: http://appium.io/slate/cn/master/ 使用方法 例如: appium --shell 服务器标志 ...
- 让browserify接收命令行参数,在打包时parse yml配置文件
功能需求: 1用browserify把各种js打包成浏览器端的1个bundle.js,含有yml配置文件 约束: 1 yml配置文件不在当前工程里(现在还不知道放哪里,以后也会变),希望在打包时,用命 ...
随机推荐
- 总结Vue第三天:模块化和webpack模块化打包:
总结Vue第三天:模块化和webpack模块化打包: 一.❀ 模块化 [导入import-----导出export] 1.为什么需要模块化? JavaScript 发展初期,代码简单地堆积在一起,只要 ...
- MFC中使用qt演练
链接 这里 note but , I dont guess that works in qt5
- 【LeetCode】802. Find Eventual Safe States 解题报告(Python)
[LeetCode]802. Find Eventual Safe States 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemi ...
- LeetCode118. Pascal's Triangle 杨辉三角
题目 给定行数,生成对应的杨辉三角 思考 同一行是对称的,最大的下标为(行数+1)/2;1,1,2,3,6;下标从0开始,则对应分别为0.0.1.1.2.2 对于第偶数行,个数也是偶数,对于奇数行,个 ...
- codeforce-601A. The Two Routes(最短路)
题意: 给你N个点表示N个站,有汽车和火车,汽车只能走公路,火车只能走铁路. 然后给你M条双向路,代表这两个点之间有铁路连接. 然后告诉你如果两个点之间没有铁路,那么就是公路连接. 问你汽车和火车都到 ...
- 教学日志:javaSE-面向对象2
一.局部变量和成员变量 package class4.oop1; /** * @Auther: Yu Panpan * @Date: 2021/12/10 - 12 - 10 - 14:47 * @D ...
- 【机器学*】k*邻算法-02
k邻*算法具体应用:2-2约会网站配对 心得体会: 1.对所有特征值进行归一化处理:将特征值单位带来的距离影响消除,使所有特征同权重--然后对不同的特征进行加权2.对于相互独立的特征,可以通过建立(特 ...
- 一个不常遇到的HbuilderX自动化测试运行问题
晚上10点左右,刚好说想研究一下uniapp项目中怎么进行自动测试,于是跟着插件的官方教程开始配置测试环境,写好了一个简单的测试脚本,然后图形化操作IDE运行测试,却报错了一大片错误信息,如下所示: ...
- Consistency Regularization for GANs
目录 概 主要内容 Zhang H., Zhang Z., Odena A. and Lee H. CONSISTENCY REGULARIZATION FOR GENERATIVE ADVERSAR ...
- <数据结构>图的最短路径问题
目录 最短路径问题 Dijstra算法:中介点优化 基本步骤 伪代码 在实现过程中的关键问题 代码实现 邻接矩阵版 邻接表版 时间复杂度:O(VlogV+E) 算法存在的问题:存在负权边时会失效 Be ...