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配置文件不在当前工程里(现在还不知道放哪里,以后也会变),希望在打包时,用命 ...
随机推荐
- 【LeetCode】 258. Add Digits 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:减1模9 方法三:直接模9 日 ...
- 【LeetCode】830. Positions of Large Groups 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- The Luckiest number(hdu2462)
The Luckiest number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 【LeetCode】712. Minimum ASCII Delete Sum for Two Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Lucky Substrings
而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if ...
- 1144 - Ray Gun
1144 - Ray Gun PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB You are ...
- Linux开关机与登录注销
开机和重启 shutdown -h now:立即关机计算机 shutdown -h 1:1分钟后关机 halt:立即关机 reboot:立即重启 sync:把内存的数据同步到磁盘 注: shutdow ...
- Java EE数据持久化框架 • 【第5章 MyBatis代码生成器和缓存配置】
全部章节 >>>> 本章目录 5.1 配置MyBatis Generator 5.1.1 MyBatis Generator介绍 5.1.2 MyBatis Generat ...
- Java EE数据持久化框架mybatis练习——获取id值为1的角色信息。
实现要求: 获取id值为1的角色信息. 实现思路: 创建角色表sys_role所对应的实体类sysRole. package entity; public class SysRole { privat ...
- 移动端的样式重置(CSS RESET)
/********** * reset *********/ * {box-sizing: border-box; -webkit-tap-highlight-color: rgba(0,0,0,0) ...