命令行参数

在写代码的时候,在运行程序做一些初始化操作的时候,往往会通过命令行传参数到程序中,那么就会用到命令行参数

例如,指定程序运行的模式和级别:

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 类型的更多相关文章

  1. Go 命令行参数,JSON 序列化与反序列化

    #### Go 命令行参数,JSON 序列,反序列化这一节来学习一下Go 如果解析命令行参数,以及JSON 的序列化及反序列化; 命令行参数对于熟悉Linux 的同学来说比较清楚,如: ls -a , ...

  2. 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子

    一:自定义实现InputFormat *数据源来自于内存 *1.InputFormat是用于处理各种数据源的,下面是实现InputFormat,数据源是来自于内存. *1.1 在程序的job.setI ...

  3. TensorFlow进阶(六)---模型保存与恢复、自定义命令行参数

    模型保存与恢复.自定义命令行参数. 在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用.模型的保存和恢复也是通过tf.train.Saver类去实现,它主 ...

  4. mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数(下边文章开头有链接) :2种类型的参数 含义是不一样的

    mysql命令行参数  --- 这些参数不同于  mysqldump  后的 那些参数   :2种类型的参数 含义是不一样的 一,mysql命令行参数 Usage: mysql [OPTIONS] [ ...

  5. Python 1基础语法四(数字类型、输入输出汇总和命令行参数)

    一.数字(Number)类型 python中数字有四种类型:整数.布尔型.浮点数和复数. int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. ...

  6. python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例

    场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...

  7. 【NS-3学习】ns3-模拟基础:关键概念,日志,命令行参数

    前言 本篇博客先介绍在仿真过程中会使用到的一些关键概念,然后介绍便于调试仿真脚本的常用技术:日志.命令行参数. 关键概念 节点 在因特网术语中,主机(终端)是指任何一台连接到网络的计算设备.ns-3并 ...

  8. Chrome浏览器启动参数大全(命令行参数)

    前言 在开发Web项目当中,浏览器必不可少,而浏览器的启动参数可以帮我们实现很多功能. 常用参数 常用参数请参考下表. 序号 参数 说明 1 --allow-outdated-plugins 不停用过 ...

  9. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

随机推荐

  1. MySQL there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause同时创建多个更新当前时间戳字段 解决方法

    问题重现 在写这篇文章之前,明确我的MySQL版本,MariaDB 或者你使用 MySQL 8 也会出现如下问题 MySQL 版本 现在有这样的需求,一张表中有一个字段created_at记录创建该条 ...

  2. asp程序里,如何判断一个字符串中存在包含了另一个字符串?

    1.判断是否包含某某字符函数是:Instr()和InstrRev();2.具体使用如下:ab="abcdefgHTTP"你可以用Instr()或者InstrRev()来判断if I ...

  3. 获取IFC构件的位置数据、方向数据

    获取IFC构件的位置数据.方向数据 std::map<int, shared_ptr<BuildingEntity>> map_buildingEntity = b_model ...

  4. Delphi 操作SQL 插入一万条数据 三种方式速度测试

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. Go语言学习笔记——Go语言数据类型

    布尔型 布尔型的值只可以是常量 true 或者 false.一个简单的例子:var b bool = true. 数字类型 整型 int 和浮点型 float32.float64,Go 语言支持整型和 ...

  6. mysql函数IFNULL的使用替换递归方法

    在电商行业经常遇到的问题就是类目与类目以及类目与商品的关系. 如果要查询一级类目下的所有商品 常规做法是先查询该一级类目下所有的二级类目,再由二级类目查询所有的三级类目,直到最后一级,再查询出对应的商 ...

  7. LeetCode:交替打印【1115】

    LeetCode:交替打印[1115] 题目描述 我们提供一个类: class FooBar { public void foo() { for (int i = 0; i < n; i++) ...

  8. web端自动化——Selenium Server环境配置

    Selenium Server环境配置 下面下载.配置并运行Selenium Server. ①    下载 Selenium Server. 下载地址为:https://pypi.python.or ...

  9. 用MATLAB的Classficiation Learner工具箱对12个数据集进行各种分类与验证

    准备材料 以所有的特征集作为variable进行像Bayes吖.SVM吖.决策树吖......分类.同时对数据进行预处理,选出相关度高的特征子集作为新的一组data进行分类(预处理的代码不必放出来). ...

  10. CSS 按钮水波纹特效

    /* 按钮反馈之波纹 */ .ripple { position: relative; /* overflow:hidden */  打开注释及效果不扩散在外 } .ripple:focus{ out ...