第二讲 命令源码文件

此为 《极客时间&Go语言核心36讲》 个人笔记,具体课程详见极客时间官网。

Table of Contents generated with DocToc

  • 第二讲 命令源码文件
    • 1. 什么是命令源码文件?
    • 2. 命令参数的接收和解析
      • 2.1 命令源码文件怎么接收参数?
      • 2.2 怎样在运行源代码文件的时候传入参数,又怎样查看参数的使用说明?
    • 3. 补充
      • 3.1 问题
      • 3.2 其他

第二讲 命令源码文件

源码文件分为三种:

  • 命令源码文件
  • 库源码文件
  • 测试源码文件

1. 什么是命令源码文件?

如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么它就是命令源码文件。

命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的,有且只有一个。

2. 命令参数的接收和解析

2.1 命令源码文件怎么接收参数?

Go语言标准库中有一个代码包专门用于接收和解析命令参数——flag

// func StringVar(p *string, name string, value string, usage string) {}
var name string
flag.StringVar(&name, "name", "zcz", "my name is ... ?")
flag.Parse()
fmt.Println(name)

参数说明:

  • p :用于存储该命令参数的值的地址;
  • name:参数名称;
  • value:默认值;
  • usage:该命令参数的简单描述,在打印命令说明时会用到;

flag.Parse()解析命令参数并把它们的值付给相应的变量。对该函数的调用必须在所有命令参数存储载体的声明(如上name的声明)和设置(如上flag.StringVar()的调用)之后,并且在读取任何命令参数值之前进行。

除了flag.StringVar()外,还有一个flag.String()方法,它会返回一个指向存储命令参数的地址:

// func String(name string, value string, usage string) *string {}
name := flag.String("name", "zcz", "my name is ... ?")
flag.Parse()
fmt.Println(name)
2.2 怎样在运行源代码文件的时候传入参数,又怎样查看参数的使用说明?

传参方式如下:

go run parameter.go -name="xxt"
//output: xxt

查看该命令源码文件的参数说明:

go run parameter.go --help
/* output:Usage of /var/folders/n2/m16dmxhn2mld82h_6ywcc14h0000gn/T/go-build1423020904/b001/exe/parameter:-name stringmy name is ... ? (default "zcz")
*/

其中,/var/folders/n2/m16dmxhn2mld82h_6ywcc14h0000gn/T/go-build1423020904/b001/exe/parametergo run命令构建上述命令源码文件时临时生成的可执行文件的完整路径。

我们还可以:

go build parameter.go
./parameter.go --help
/* output:Usage of ./parameter:-name stringmy name is ... ? (default "zcz")
*/

3. 补充

3.1 问题
var name string
flag.StringVar(&name, "name1", "zcz01", "my name is ... ?")
flag.StringVar(&name, "name2", "zcz02", "wtf ?")
flag.Parse()
fmt.Println(name)
  • 执行go run parameter.go -name1="kodo" -name2="pili",输出为:pili
  • 执行go run parameter.go -name2="pili" -name1="kodo",输出为:kodo
  • 执行go run parameter.go -name1="kodo",输出为:kodo
  • 执行go run parameter.go -name2="pili",输出为:pili

why?(后续解决)

3.2 其他
  • 默认情况下,我们可以让命令源码文件接受哪些类型的参数值?

    int ( int | int64 | uint | uint64 ) ,
    float ( float | float64 ) ,
    string ,
    bool ,
    duration ( 时间 ) ,
    var ( 自定义 )

  • 我们可以把自定义的数据类型作为参数值的类型吗?如果可以,怎样做?

    关键就是使用flag.var(),关键点在于需要实现flag包的Value接口。(后续会展开)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员过关斩将--为微服务撸一个简约而不简单的配置中心

点击上方蓝字 关注我们毫不犹豫的说,现代高速发展的互联网造就了一批又一批的网络红人,这一批批网红又极大的催生了特定平台的一大波流量,但是留给了程序员却是一地鸡毛,无论是运维还是开发,每天都会担心服务器崩溃&a…

Just a Hook HDU - 1698(查询区间求和+最基础模板)

题意: 给你一个1~n的区间,起始区间内均为1,然后对子区间进行值更新,最后求区间和。 题目: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is ma…

DDIA笔记——数据复制

Table of Contents generated with DocToc 此篇为《数据密集型应用系统设计》(DDIA)读书笔记,笔记可能存在遗漏,建议直接阅读原书。 第五章 数据复制 主从复制 复制滞后复制滞后带来的问题 多主节点复制 适用场景处理写冲突拓扑结…

基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理

上一篇文章成功使用了Redis缓存数据,大大提高博客的响应性能。接下来,将完成一个任务调度中心,关于定时任务有多种处理方式,如果你的需求比较简单,比如就是单纯的过多少时间循环执行某个操作,可以直接使用.…

Docker基本组成 和 基本命令

此篇为Docker笔记,文章可能存在疏忽,建议直接观看原视频。 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from333.999.0.0 Docker基本组成 和 基本命令 镜像 image:就好比一个模板,可以通过这个模板…

Assign the task HDU - 3974(线段树+dfs建树+单点查询+区间修改)

题意: 染色问题:给一个固定结构的树,现在有两个操作: (1) y 将结点x及其所有后代结点染成颜色y; (2)查询结点x当前的颜色。 其实就是区间染色问题,不过需要d…

Docker镜像讲解

此篇为Docker笔记,文章可能存在疏忽,建议直接观看原视频。 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from333.999.0.0 参考:https://blog.csdn.net/11b202/article/details/21389067 Docker镜像讲解 镜像是…

Making the Grade POJ - 3666(离散化+dp)

题意: 给你n个山的高度,单独的一个数可以任意加减,让经过对每座山峰任意加减高度后变成递增或递减的序列时,求对每个数的相加或相减的数目的最小和。 题目: A straight dirt road connects two fields on FJ’s far…

Kubernetes的安全性怎么解?从4个方面为你列出方案清单

导语Kubernetes中的安全性是一个多维问题,必须从各个不同的角度来解决才算完善,这篇文章将从4个方面为读者列出安全清单。正文Kubernetes,经过更快的采用和社区的更多贡献,正日益攀登到新的高度。不过,安全性仍然是Kub…

DDIA笔记—第六章 数据分区

第六章 数据分区 数据分区与数据复制 分区通常与复制结合使用,即每个分区在多个节点都存在副本,这就意味着某条记录属于特定的分区,而同样的内容会保存在不同的节点上以提高系统的容错性。 每个节点同时充当某些分区的主副本和其他分区的从…

Piggy-Bank POJ - 1384(完全背包+背包放满)

题意: 给出一个存钱罐的重量和没存钱之前存钱罐的重量,然后给出几种硬币的重量和币值,计算存钱罐里至少有多少钱。 题目: Before ACM can do anything, a budget must be prepared and the necessary financial support obtain…

Magicodes.IE 2.2发布

Magicodes.IE 2.2发布导入导出通用库,支持DTO导入导出以及动态导出,支持Excel、Word、PDF、CSV和HTML。已加入ncc开源组织.Magicodes.IE2.0发布Magicodes.IE2.1发布如何做好一个开源项目(一)GitHub:https://github.com/dotnetcore/Magicodes.…

C++ 基类,子对象,派生类构造函数调用顺序

#include <iostream> using namespace std;class A {public:A( ) {cout << "A Constructor………" << endl;}~A( ) {cout << "A Destructor………" << endl;} };class B: public A {public:B( ) {cout << "B …

牛客网 第十七届中国计量大学程序设计竞赛(同步赛)(重现赛)B题 Broken Pad 暴力+思维

题意&#xff1a; 给你两个01串&#xff0c;经过两种操作&#xff0c;1.直接让第一串经过操作变成目标串&#xff1b;2.可以点击空白处&#xff0c;即0的地方&#xff0c;使得操作串全部清空为0串&#xff0c;再变为目标串&#xff1b;最终比较两种方式&#xff0c;哪种需更少…

C++ 虚析构函数

代码如下: #include <iostream> using namespace std;class Base {public:Base() {cout << "Base" << endl;}~Base() {cout << "Base destructor" << endl;} };class Derived : public Base {public:Derived() {cout <&…

I - Interesting Permutation Gym - 102394I(排列组合)

题意&#xff1a; 纯数题 1≤i≤n, fimax{a1,a2,…,ai}; 1≤i≤n, gimin{a1,a2,…,ai}; 1≤i≤n, hifi−gi. 数列a是一个排列&#xff0c;问多少种排列方式满足h数列。 题目&#xff1a; DreamGrid has an interesting permutation of 1,2,…,n denoted by a1,a2,…,an. He …