Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

02 | 命令源码文件

创建私有的命令参数容器
flag.CommandLine重新赋值
flag.Usage重新赋值
自定义参数使用说明
查看参数使用说明
通过命令行传入参数
flag.Parse函数
flag.StringVar函数
使用flag包接收和解析命令参数
包含一个无参数声明且无结果声明的main函数
声明属于main
声明属于main包且包含main函数
通过构建或安装生成可执行文件
每个可独立运行的程序必须拥有的
程序的运行入口
可以把自定义的数据类型作为参数值的类型吗
默认情况下命令源码文件可以接受哪些类型的参数值
自定义命令源码文件的参数使用说明
运行命令源码文件时传入参数
命令源码文件的参数接收和解析
命令源码文件的编写规则
命令源码文件的用途
思考题
知识点
命令源码文件

该思维导图由 AI 生成,仅供参考

我们已经知道,环境变量 GOPATH 指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件。
这里的源码文件又分为三种,即:命令源码文件、库源码文件和测试源码文件,它们都有着不同的用途和编写规则。( 我在“预习篇”的基础知识图介绍过这三种文件的基本情况。)
(长按保存大图查看)
今天,我们就沿着命令源码文件的知识点,展开更深层级的学习。
一旦开始学习用编程语言编写程序,我们就一定希望在编码的过程中及时地得到反馈,只有这样才能清楚对错。实际上,我们的有效学习和进步,都是通过不断地接受反馈和执行修正实现的。
对于 Go 语言学习者来说,你在学习阶段中,也一定会经常编写可以直接运行的程序。这样的程序肯定会涉及命令源码文件的编写,而且,命令源码文件也可以很方便地用go run命令启动。
那么,我今天的问题就是:命令源码文件的用途是什么,怎样编写它?
这里,我给出你一个参考的回答:命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。我们可以通过构建或安装,生成与其对应的可执行文件,后者一般会与该命令源码文件的直接父目录同名。
如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么它就是命令源码文件。 就像下面这段代码:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在Go语言中命令源码文件的重要性以及其用途和编写规则。命令源码文件是程序的运行入口,每个可独立运行的程序都必须拥有命令源码文件。文章详细讨论了命令源码文件如何接收和解析命令参数,以及如何在运行命令源码文件时传入参数和查看参数的使用说明。通过引入`flag`包,读者可以学习如何使用`flag.StringVar`函数来接收命令参数,并通过`flag.Parse`函数进行解析。此外,读者还可以了解如何定制命令参数容器,以及如何让命令源码文件接受不同类型的参数值。总体而言,本文为读者提供了深入学习命令源码文件及相关知识的指导,帮助他们更好地理解和应用Go语言中的命令源码文件。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(77)

  • 最新
  • 精选
  • 姜雨生
    置顶
    flag的讲解很棒,通过这个命令,我们就可以控制程序在不同环境的执行内容了,通过控制参数设置更多的内容!
    2019-02-28
    32
  • 梦里追逐
    咱们用的都是哪个IDE?

    作者回复: 你好,我用的是goland,但是代码不会依赖于IDE的,只会依赖于Go语言本身。免费的编辑器推荐vs code。

    2018-08-15
    7
  • 吉祥
    undefined: os 怎么回事

    作者回复: 你好,请到GitHub上下载完整的源码文件。

    2018-08-13
    2
    5
  • 传说中的成大大
    不太明白的地方在于 flag.stringvar 和flag.parse的作用 前面调用了flag.stringvar并且已经传入了name地址 为什么还要再调用一次flag.parse?

    作者回复: 前者是“注册”,后者是“处理”。这是两个步骤。“处理”只会针对那些已“注册”的参数。打个比方,你报了个培训班,交了钱、拿到了入场证,这就相当于“注册”。但是你还得去上课,只有去了课堂才能学到东西,这就相当于“处理”。

    2020-02-10
    2
    4
  • 弥撒
    老师好,在执行demo2.go程序运行的时候,我打印了一下init()方法和main()方法的执行顺序,发现init方法先与flag.Parse()这句话之前就运行了,这是什么原因,程序入口不是main方法吗?

    作者回复: 有这样一个规则: main 包中的所有 init 函数都会先于 main 函数执行,main 包直接依赖的那些代码包中的 init 函数会先于 main 包中的 init 函数执行,以此类推(与依赖方向完全相反)。

    2019-05-25
    4
  • mayunian
    老师,今天试了一下类型转换。 为什么转换var x uint = uint(-1) 的时候会报错? 而var y int = -1 var x uint = uint(y)就不会报错呢?

    作者回复: -1是负数,编译器看出来了,帮你挑出来。y是int类型的变量,编译器不知道里面存的是不是负数,没法帮你挑出来。转换会成功结果会不正确。

    2018-08-30
    2
    4
  • NEVER SETTLE
    老师,package name 是不能使用下划线吗,我在用vscode时候,go-lint插件会报这个警告。

    作者回复: 依据Go语言规范这样做是没问题的,可以编译通过。只不过这个插件会检查一些“最佳实践”的东西,所以会出现相应的警告。关于Go代码包命名的最佳实践可以参考这篇官方博客:https://blog.golang.org/package-names 。这里还有一篇优秀英文博客的中文翻译,可以供参考:https://studygolang.com/articles/11823 。

    2019-04-17
    2
  • 但爱
    老师帮忙解答一下注释中的问题: package main import "flag" import "fmt" var name string // init方法调用时间? func init(){ // 当前方法相当于注册一个钩子 flag.StringVar(&name, "name", "everyone", "put you name.") // flag.String()方法会实时返回参数值,是否做了实时参数解析,如果多次调用,是否是每次执行都解析一遍,效率是否有影响? } func main(){ // 真正解析传递参数的地方,解析到一个参数后,查询是否有对应注册的钩子,如果有,则赋值,顺序 flag.Parse() fmt.Printf("Hello %s!", name) }

    作者回复: 解析是在 flag.Parse() 函数中进行的,剩下的你试一下就知道了。

    2019-02-22
    2
  • 王聪 Claire
    请问linux下有什么好用的go语言的IDE推荐吗?谢谢。

    作者回复: vim、emacs、vscode、liteide

    2019-04-25
    1
  • 小样
    ??init函数是什么,没地方调用啊。是系统的默认的?

    作者回复: 对,是Go语言运行时系统自动调用的,在初始化它所在的代码包的时候。在同一个运行着的程序中,每个代码包中的init函数只会被调用一次。另外每个代码包还可以有多个init函数,而且他们的执行顺序与编写顺序无关。

    2019-03-21
    1
收起评论
显示
设置
留言
77
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部