命令行参数 && json 协议 && 自定义 error 类型
命令行参数
在写代码的时候,在运行程序做一些初始化操作的时候,往往会通过命令行传参数到程序中,那么就会用到命令行参数
例如,指定程序运行的模式和级别:
go run HTTPServer.go --mode survival --level 1
os.Args
可以通过 os 包的 Args 变量来获取所有命令行参数,得到的是一个 string 切片类型([]string),第一个命令行参数就是执行文件本身
package main
import (
"fmt"
"os"
) func main (){
fmt.Println(os.Args)
} 运行结果:
[C:\Users\chenkai\AppData\Local\Temp\___go_build_main_go__3_.exe]
flag 包
使用 flag 包解析命令行参数的方法有两类,下面记录一下用法
1)对已初始化的变量进行赋值(推荐使用)
package main
import (
"flag"
"fmt"
) func main (){
var mode string
var level int
var onOff bool flag.StringVar(&mode,"mode", "survival", "game pattern")
flag.IntVar(&level, "level", 1, "game level")
flag.BoolVar(&onOff, "onOff", true, "game onOff") //解析命令行参数
flag.Parse()
fmt.Printf("%v\t%v\t%v\t", mode, level, onOff)
} 运行结果:
survival 0 true
2)使用指针变量接收
package main
import (
"flag"
"fmt"
) func main (){
var mode *string = flag.String("mode", "survival", "game pattern")
var level *int = flag.Int("level", 1, "game level")
var onOff *bool = flag.Bool("onOff", true, "game onOff") //解析命令行参数
flag.Parse()
fmt.Printf("%v\t%v\t%v\t\n", mode, level, onOff)
fmt.Printf("%v\t%v\t%v\t", *mode, *level, *onOff)
} 运行结果:
0xc00004e200 0xc0000620c0 0xc0000620c8
survival 0 true
json 协议
json 是跨平台的一种数据格式,当然,Go 也是支持 json 协议的,分为 json 序列化 和 反序列化
- 序列化:将 Go 中的数据类型转换成 json 格式的字符串
- 反序列化:将 json 字符串作用于 Go 中的数据类型上
1)序列化(json.Marshal)
结构体转 json:
package main
import (
"encoding/json"
"fmt"
) type User struct {
UserName string
NickName string
Age int
Sex string
Email string
} func main (){
var userA User = User{
UserName: "托尼",
NickName: "tony",
Age: 36,
Sex: "男",
Email: "tony@163.com",
} var jsonData []byte
//func Marshal(v interface{}) ([]byte, error)
jsonData, err := json.Marshal(userA)
if err != nil {
fmt.Printf("json marshal error[%v]", err)
}
fmt.Println(string(jsonData))
} 运行结果:
{"UserName":"托尼","NickName":"tony","Age":36,"Sex":"男","Email":"tony@163.com"}
如果想要更改 json 字符串的 key,可以设置结构体 json 标签:
package main
import (
"encoding/json"
"fmt"
) type User struct {
UserName string `json:"username"`
NickName string `json:"nickname"`
Age int `json:"age"`
Sex string `json:"sex"`
Email string `json:"email"`
} func main (){
var userA User = User{
UserName: "托尼",
NickName: "tony",
Age: 36,
Sex: "男",
Email: "tony@163.com",
} var jsonData []byte
//func Marshal(v interface{}) ([]byte, error)
jsonData, err := json.Marshal(userA)
if err != nil {
fmt.Printf("json marshal error[%v]", err)
}
fmt.Println(string(jsonData))
} 运行结果:
{"username":"托尼","nickname":"tony","age":36,"sex":"男","email":"tony@163.com"}
map 转 json:
package main
import (
"encoding/json"
"fmt"
) func main (){
var mapA map[string]string = make(map[string]string)
mapA["name"] = "johny"
mapA["email"] = "johny@163.com" var jsonData []byte
jsonData, err := json.Marshal(mapA)
if err != nil {
fmt.Printf("json marshal error[%v]", err)
}
fmt.Println(string(jsonData))
} 运行结果:
{"email":"johny@163.com","name":"johny"}
2)反序列化(json.Unmarshal)
json 返序列化为结构体:先获取一个结构体的 json 数据,然后赋值给另一个 结构体类型
package main
import (
"encoding/json"
"fmt"
) type User struct {
UserName string `json:"username"`
NickName string `json:"nickname"`
Age int `json:"age"`
Sex string `json:"sex"`
Email string `json:"email"`
} func marshalData() string {
var userA User = User{
UserName: "托尼",
NickName: "tony",
Age: 36,
Sex: "男",
Email: "tony@163.com",
} var jsonData []byte
//func Marshal(v interface{}) ([]byte, error)
jsonData, err := json.Marshal(userA)
if err != nil {
fmt.Printf("json marshal error[%v]", err)
}
return string(jsonData)
} func main (){
jsonData := marshalData() var userB User = User{}
fmt.Println(userB)
//func Unmarshal(data []byte, v interface{}) error
err := json.Unmarshal([]byte(jsonData), &userB)
if err != nil {
fmt.Printf("json unmarshal error[%v]", err)
}
fmt.Println(userB)
} 运行结果:
{ 0 } //空白部分是空字符串,string 类型默认值是空字符串,int 类型默认值是 0
{托尼 tony 36 男 tony@163.com}
自定义 error
自定义错误内容一般用的很少,不过也需要了解一下,主要是实现一个 Error() 方法,成为 error 接口类型即可实现自定义的错误类型
实现了 error 接口,就是 error 类型,error 接口定义如下:
type error interface {
Error() string
}
demo:打开文件错误时,返回自定义的错误内容
package main import (
"encoding/json"
"fmt"
"os"
"time"
) type OpenError struct {
Path string
Operation string
CreateTime time.Time
Message string
} func (openErr OpenError) Error() string { var jsonData []byte
jsonData, err := json.Marshal(openErr)
if err != nil {
fmt.Printf("json marshal error[%v]", err)
}
return string(jsonData)
} func openFile(filepath string) error {
file, err := os.Open(filepath)
if err != nil {
var openErr OpenError = OpenError{
Path: filepath,
Operation:"read",
CreateTime: time.Now(),
Message: err.Error(), }
return openErr
}
defer file.Close() return nil
} func main(){
//err := openFile("D:\\golang_workspace\\file_test\\source.txt")
err := openFile("D:\\golang_workspace\\file_testsdafs")
if err != nil {
fmt.Println(err.Error())
}
} 运行结果:
{"Path":"D:\\golang_workspace\\file_testsdafs","Operation":"read","CreateTime":"2019-07-23T22:50:31.7511949+08:00","Message":"open D:\\golang_workspace\\file_testsdafs: The system cannot find the file specified."}
ending ~
命令行参数 && json 协议 && 自定义 error 类型的更多相关文章
- Go 命令行参数,JSON 序列化与反序列化
#### Go 命令行参数,JSON 序列,反序列化这一节来学习一下Go 如果解析命令行参数,以及JSON 的序列化及反序列化; 命令行参数对于熟悉Linux 的同学来说比较清楚,如: ls -a , ...
- 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
一:自定义实现InputFormat *数据源来自于内存 *1.InputFormat是用于处理各种数据源的,下面是实现InputFormat,数据源是来自于内存. *1.1 在程序的job.setI ...
- TensorFlow进阶(六)---模型保存与恢复、自定义命令行参数
模型保存与恢复.自定义命令行参数. 在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用.模型的保存和恢复也是通过tf.train.Saver类去实现,它主 ...
- mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数(下边文章开头有链接) :2种类型的参数 含义是不一样的
mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数 :2种类型的参数 含义是不一样的 一,mysql命令行参数 Usage: mysql [OPTIONS] [ ...
- Python 1基础语法四(数字类型、输入输出汇总和命令行参数)
一.数字(Number)类型 python中数字有四种类型:整数.布尔型.浮点数和复数. int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. ...
- python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例
场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...
- 【NS-3学习】ns3-模拟基础:关键概念,日志,命令行参数
前言 本篇博客先介绍在仿真过程中会使用到的一些关键概念,然后介绍便于调试仿真脚本的常用技术:日志.命令行参数. 关键概念 节点 在因特网术语中,主机(终端)是指任何一台连接到网络的计算设备.ns-3并 ...
- Chrome浏览器启动参数大全(命令行参数)
前言 在开发Web项目当中,浏览器必不可少,而浏览器的启动参数可以帮我们实现很多功能. 常用参数 常用参数请参考下表. 序号 参数 说明 1 --allow-outdated-plugins 不停用过 ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
随机推荐
- markdown如何在表格内换行?
答:使用<br>即可在表格内换行
- 利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题
利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2) 启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了 ...
- linux查看 LAMP环境安装路径
Apache: 如果采用RPM包安装,安装路径应在 /etc/httpd目录下 apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/a ...
- iptables 4张表 5条链
- 修改jar包内容并打包上传到私服
第一步:拉下git分支中代码,进行修改,修改后commit——>push 第二步:在IDEA中Terminal中执行命令进行打包到本地mvn clean package 第三步:上传到私服,方法 ...
- Information:java: Multiple encodings set for module chunk platf "GBK" will be used by compile
转自:https://blog.csdn.net/xiaobing_122613/article/details/81866445 Intellij IDEA 在引入代码后,出现编译错误. Infor ...
- matplotlib 常用操作
标准的Python中用列表(list)保存一组值,可以当作数组使用.但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针.这样一来,为了保存一个简单的列表[1,2,3],就需 要有三个指针和三 ...
- 001-guava概述
一.概述 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives supp ...
- Flutter常用库:
flutter_screenutil: ^0.6.0 #用于屏幕适配的包 dio: ^3.0.3 #建立请求需要的包 event_bus: ^1.1.0 #事件发布的包 shared_preferen ...
- SQL语句精妙集合
1一.基础 2 31.说明:创建数据库 4Create DATABASE database-name 5 62.说明:删除数据库 7drop database dbname 8 93. ...