1.源码文件分类
环境变量GOPATH指向的是一个或多个工作区,而且每个工作区都会有以代码包为基本组织形式的源码文件。
源码文件分为三种,即:命令源码文件、库源码文件和测试源码文件。
2.什么是命令源码文件,它有什么用途,怎样编写它
命令源码文件是程序的运行入口,是每个可读库运行的程序必须拥有的。如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么就是命令源码文件。
当需要模块化编程时,我们会将代码拆分到多个文件下,不同的代码包中。但无论怎样,对于一个独立的程序来说命令源码文件永远只会也只能有一个。如果有与命令源码文件同包的源码文件,那么他们也应该声明属于main包。
3.命令源码文件怎样接收参数
go语言标准库中有一个代码包专门用于接收和解析命令参数。这个代码包的名字叫做flag。下面根据例子来进行讲解。
例子:
package main
import (
"flag" //导入所需的flag包
"fmt"
)
var name string
func init() {
flag.StringVar(&name, "name", "every one", "to say hello")//初始化flag,第一个参数用于储存该命令参数的值的地址,第二个参数是为了指定命令参数名称,第三个参数是为使用参数时的默认值,第四个参数为说明参数。
此处还可以改为var name = flag.String("name","everyone","the greeting object")
}
func main() {
flag.Parse()//解析命令参数
fmt.Println("hello world " + name)
}
4.怎样在运行命令源码文件时传入参数,以及怎样查看参数使用说明
运行如下命令传入参数:
go run test.go -name="Robert"
运行结果:
Hello world Robert
查看命令源码文件的参数说明 go run test.go --help
结果:
Usage of C:\Users\nshu\AppData\Local\Temp\go build740295486\b001\exe\test.exe:
-name string
to say hello (default "every one")
exit status 2
第一行为go run临时生成的可执行文件的完整路径。
5.怎样自定义命令源码文件的参数使用说明
自定义命令源码文件的参数使用说明有很多方法,在这举几个例子:
1.对变量flag.Usage重新赋值,该变量在声明flag时就已经被赋值了,在这里可以对它重新赋值。对flag.Usage的赋值必须在调用flag.Parse函数之前
例子:
flag.Usage = func() {
fmt.Printf("Usage of %s:\n", "question")
flag.PrintDefaults()
}
再输入go run test.go --help之后输出:
Usage of question:
-name string
to say hello (default "every one")
exit status 2
2.当我们在调用flag包中的一些函数(例如StringVar)的时候,实际上在调用flag.CommandLine变量的对应方法,这时我们可以通过以下方法来定义参数使用说明:
func init() {
flag.CommandLine= flag.NewFlagSet("", flag.ExitOnError)
flag.CommandLine.Usage = func() {
fmt.Printf("Usage of %s:\n", "question")
flag.PrintDefaults()
}
flag.StringVar(&name, "name", "every one", "to say hello")
}
此时将flag.ExitOnError改为flag.PanicOnError此时就会产生另一种输出效果。这两个参数都是flag包中的常量。
flag.ExitOnError的含义是,告诉命令参数容器,当命令后跟--help或者参数不正确时,打印命令参数使用说明后以状态码2结束当前程序。
flag.PanicOnError与之的区别是在最后跑出“运行时错误”
3.我们还可以自己创建一个私有的命令参数容器来代替flag.CommandLine
例子:package main
import (
"flag"
"fmt"
"os"
)
var name string
var nshu = flag.NewFlagSet("", flag.PanicOnError)
func init() {
nshu.Usage = func() {
fmt.Printf("Usage of %s:\n", "question")
nshu.PrintDefaults()
}
nshu.StringVar(&name, "name", "every one", "to say hello")
}
func main() {
// flag.Usage = func() {
// fmt.Printf("Usage of %s:\n", "question")
// flag.PrintDefaults()
// }
nshu.Parse(os.Args[1:]) //与之前flag下的Parse不一样
fmt.Println("hello world " + name)
}
这种定制并不会影响全局变量flag.CommandLine

转载于:https://juejin.im/post/5b83e3ecf265da43682f6a10

go语言学习笔记(2)命令源码文件相关推荐

  1. K8s基础知识学习笔记及部分源码剖析

    K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...

  2. JUC.Condition学习笔记[附详细源码解析]

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  3. 第二讲 命令源码文件

    此为 <极客时间&Go语言核心36讲> 个人笔记,具体课程详见极客时间官网. Table of Contents generated with DocToc 第二讲 命令源码文件 ...

  4. R语言学习笔记(八)--读写文件与网络爬虫

    R语言学习笔记(八) 1 工作路径 2 保存R对象 3 Scan函数 3-1 从控制台读取数据 3-2 从txt文件读取数据 3-3 从url读取数据 4 按行读写文本文件 5 读取文本文件(txt. ...

  5. Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)

    在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...

  6. The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译

    前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部件.由于部分包在墙外,带来了一点麻烦,还分享一个 replace 方式来翻墙的办法. 小能手这段时间在学习 The Things ...

  7. The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译 - 190821

    文章目录 前言 1 依赖包替换 2 编译准备 3 编译 3.1 cli 编译 3.2 stack 编译 3.3 前端编译 END 前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部 ...

  8. 【从线性回归到 卷积神经网络CNN 循环神经网络RNN Pytorch 学习笔记 目录整合 源码解读 B站刘二大人 绪论(0/10)】

    深度学习 Pytorch 学习笔记 目录整合 数学推导与源码详解 B站刘二大人 目录传送门: 线性模型 Linear-Model 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人( ...

  9. Netty学习笔记 - 1 (带源码分析部分)

    2021年12月 北京 xxd 一.Netty是什么 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用 ...

最新文章

  1. 用GDB调试程序(二)
  2. [激励机制]浅谈内部竞争——如何让你的员工玩命干活?
  3. SQL学习之SELECT子句顺序
  4. 解决React Native unable to load script from assets index.android.bundle on windows
  5. 求锤得锤,你要的一致性 hash 来了! | 附代码
  6. 保存文件_正确保存Zbrush文件
  7. Android Studio 第一个JNI程序
  8. Windows10系统打开程序应用提示『不支持此接口』的解决方案
  9. 致每一位Java初学者
  10. 关于AD9371FilterWizard无法运行问题
  11. FastDFS原理介绍
  12. PHP绘制正方形印章,ps绘制一款正方形的个人印章的方法
  13. OpenGL中的Alpha测试,深度测试,模板测试,裁减测试 .
  14. Win8.1在关机界面卡住无反应问题的解决
  15. OCR表格识别—(一)
  16. CSS选择器和层叠性
  17. 光学成像系统中的像差
  18. Linux命令教程第二期
  19. [转帖]差之毫厘谬之千里!带你认识CPU后缀含义
  20. 全球与中国通用级聚苯乙烯(GPPS)市场深度研究分析报告

热门文章

  1. ValueError: slice index xxxx of dimension 0 out of bounds,详细分析。
  2. Centos7安装Python3.7
  3. Leetcode题库203.移除链表元素(尾指针填充 / 虚头指针定义 c实现)
  4. velocity显示List与Map的方法详细解析
  5. 学习使用 Manifest
  6. java多线程学习-java.util.concurrent详解
  7. WCF 调用webservice
  8. 聊聊技术写作的个人体会
  9. h5新增 history的应用
  10. Struts-config.xml配置文件《action-mappings》元素的详解