#### 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. 贪心——55. 跳跃游戏 && 45.跳跃游戏II

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...

  2. JAVA查询类别(菜单)下的所有子类别(递归)

    /** * 获取父类别下面的所有子类别 * @return List<StoreGoodsCate> 返回当前类别下的所有子类别集合 */ public List<StoreGood ...

  3. xcode 常用指令

    使用LLDB进行调试时,如何打印一个数组:p *(int(*)[10])ptr或者是从ptr的第3个元素开始显示10个元素p *(int(*)[10])&ptr[3]

  4. 【LeetCode】163. Missing Ranges 解题报告 (C++)

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

  5. 【LeetCode】667. Beautiful Arrangement II 解题报告(Python & C++)

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

  6. 第47篇-解释执行的Java方法调用native方法小实例

    举个小实例,如下: public class TestJNI { static { // 程序在加载时,自动加载libdiaoyong.so库 System.loadLibrary("dia ...

  7. CS5210完全替代AG6202|HDMI转VGA芯片+原理图|替代兼容AG6202

    安格AG6202是一个HDMI转VGA不带音频解决方案,用于实现HDMI1.4高分辨率视频转VGA转换器.Capstone  CS5210不管在性能上和设计参数上面都是可以完全替代安格AG6202,且 ...

  8. Web前端浏览器默认样式重置(CSS Tools: Reset CSS)

    /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, ...

  9. 云南农职《JavaScript交互式网页设计》 综合机试试卷⑤——简单分类菜单

    一.语言和环境 实现语言:HTML,CSS,JavaScript,JQuery. 开发环境:HBuilder. 二.题目(100分): 1.使用Jquery和JavaScript实现二级分类菜单管理 ...

  10. markdownpad 2 pro版本(注册码)

    简介 markdown – 一种轻量级文本标记语言,当今程序员必备技能markdownpad -- windows平台下好用的markdown编辑器 官网下载地址:http://www.markdow ...