#### 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. office2007(word2007)另存为pdf文档

    默认office2007(word2007)是没有另存为pdf文档的功能的,需要安装插件 插件地址:https://yvioo.lanzous.com/iO5myedoceh 下载之后直接安装,安装成 ...

  2. c++参数入栈顺序和参数计算顺序

    关于 本文涉及到代码,演示环境为:win10 + VS2017 ,ubuntu+clang clang版本: 参数入栈顺序 顺序 几种常见的函数参数入栈顺序,还有两种就不介绍了(__clrcall._ ...

  3. 【LeetCode】857. Minimum Cost to Hire K Workers 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/minimum- ...

  4. mac学习Python第二天:开发工具安装、编程方式、中文编码、syntaxError语法错误、注释、语法格式

    一.python集成开发工具Visual Studio Code安装配置 1.官网下载安装VSCode 官网地址 https://code.visualstudio.com/下载软件包 VSCode ...

  5. Codeforces 888C: K-Dominant Character(水题)

    You are given a string s consisting of lowercase Latin letters. Character c is called k-dominant iff ...

  6. Dubbo 的设计思想

    在java远程调用多年的沉淀 <1>首先是socket调用.在orderService中开放socket服务,在userService中进行远程调用. 优点:解决了单机调用的问题. 缺点: ...

  7. 'real'词频分析

    写下来想法来自于无聊时写的代码.https://cryptopals.com/sets/1/challenges/3 The hex encoded string: 1b37373331363f781 ...

  8. FreeSql.Provider.SqliteCore如何加密

    FreeSql.Provider.SqliteCore 是FreeSql基于微软提供的最新的Microsoft.Data.Sqlite.Core驱动的实现. 支持的版本 .NETStandard2.0 ...

  9. 剖析Defi之Uinswap_1

    学习UniswapERC20,它是交易对的父合约.UniswapV2ERC20 是流动性代币合约,也称为 LP Token.功能主要实习ERC20代币功能以及对线下签名授权. 1 pragma sol ...

  10. .NET6: 三分钟搭建WPF三维应用

    要运行本文中的示例,请先安装Vistual Studio 2022,社区版就可以了. 1 创建项目 选择创建WPF应用 给程序起一个酷酷的名字,选一个酷酷的位置: 选一下.NET6 2 配置项目 从n ...