内容简介:包是有源码文件组成,源码文件分为三种,库源码文件,命令源码文件,测试源码文件定义:命令源码文件是程序的原型入口,是每个可独立运行的程序必须拥有的,我们可以通过构建和安装生成对应的可执行文件,后者一般与该命令源码文件的直接父目录同名下面演示如何创建命令源码文件和执行该源码文件
包是有源码文件组成,源码文件分为三种,库源码文件,命令源码文件,测试源码文件
命令源码文件
定义:命令源码文件是程序的原型入口,是每个可独立运行的程序必须拥有的,我们可以通过构建和安装生成对应的可执行文件,后者一般与该命令源码文件的直接父目录同名
下面演示如何创建命令源码文件和执行该源码文件
创建一个文件夹 main
创建一个源码文件main.go
package main import "fmt" func main(){ fmt.Println("hello world") }
在命令行输入命令 go run main.go
image.png
千万注意一点 对于一个独立程序而言,命令源码文件只能有一个,如果有与命令源码同包的源码文件,应该声明属于main包
命令源码文件怎么接受参数
go 语言中用于接受和解析命令的参数的包叫做flag
flag.StringVar(&name,"name","everyone","the greenting object")
参数1 存储该命令参数的值的地址
参数2 指定该命令参数的名称
参数3 如果没有输入命令值,此值将会成为默认值
参数4 该命令的简短说明
var name = flag.String("name","everyone","the greenting object")
这个方法和上面的最大区别在于它会自动分配一个内存地址存储参数值的地址
flag.parse() 用于正确解析命令参数,并把它的值赋值给相应的变量
注意 这个函数的调用的时机,必须在所有命令参数存储体的声明和设置之后,并且在读取任何命令参数值之前进行
正因为如此,我们组好把flag.parse() 放在main 函数第一行
package main import ( "fmt" "flag" ) var name string func init() { flag.StringVar(&name,"name","everyone","这个是获取命令输入参数的") } func main(){ flag.Parse() fmt.Printf("hello world, %s --",name) }
怎么运行命令源码文件时传入参数呢?
go run main.go -name="xj"
image.png
命令缺省呢?
go run main.go
image.png
查看命令说明
go run main.go -help
image.png
/var/folders/gk/zc__29js08g1g03xrzgl8m1m0000gn/T/go-build470567012/command-line-arguments/_obj/exe/main
这个是go run 命令构建上述命令源码文件临时生成的可执行文件
下面是完成的构建过程
image.png
附赠一个安装教程
既然有很多其他编程语言可以做同样的工作,如 Python,Ruby,Nodejs 等,为什么要选择 Golang 作为服务端编程语言?
以下是我使用 Go 语言时发现的一些优点:
并发是语言的一部分(译注:并非通过标准库实现),所以编写多线程程序会是一件很容易的事。后续教程将会讨论到,并发是通过 Goroutines 和 channels 机制实现的。
Golang 是一种编译型语言。源代码会编译为二进制机器码。而在解释型语言中没有这个过程,如 Nodejs 中的 JavaScript。
语言规范十分简洁。所有规范都在一个页面展示,你甚至都可以用它来编写你自己的编译器呢。:smile:
Go 编译器支持静态链接。所有 Go 代码都可以静态链接为一个大的二进制文件(译注:相对现在的磁盘空间,其实根本不大),并可以轻松部署到云服务器,而不必担心各种依赖性。
安装
Golang 支持三个平台:Mac,Windows 和 Linux(译注:不只是这三个,也支持其他主流平台)。你可以在 https://golang.org/dl/ 中下载相应平台的二进制文件。(译注:因为众所周知的原因,如果下载不了,请到 https://studygolang.com/dl 下载)
Mac OS
在 https://golang.org/dl/ 下载安装程序。双击开始安装并且遵循安装提示,会将 Golang 安装到 /usr/local/go 目录下,同时 /usr/local/go/bin 文件夹也会被添加到 PATH 环境变量中。
Windows
在 https://golang.org/dl/ 下载 MSI 安装程序。双击开始安装并且遵循安装提示,会将 Golang 安装到 C:\Go 目录下,同时 c:\Go\bin 目录也会被添加到你的 PATH 环境变量中。
Linux
在 https://golang.org/dl/ 下载 tar 文件,并解压到 /usr/local。
请添加 /usr/local/go/bin 到 PATH 环境变量中。Go 就已经成功安装在 Linux 上了
接着一篇解析讲解
如何自定义命令源码的说明
给 flag.Usage 重新赋值即可更改
go run main.go -help
原始的查看说明
image.png
下面我们重写flag.Usage
func main(){ flag.Usage = func() { fmt.Fprintf(os.Stderr,"这个是重写后的参数说明 %s","question") flag.PrintDefaults() } flag.Parse() fmt.Printf("hello world, %s --",name) }
执行上面相同的命令
image.png
继续探讨
flag.String 和flag.StringVar flag.Parse 等等,其实是调用了flag.CommandLine 变量的对应方法,flag.CommandLine相当于默认的命令参数容器,所以对flag.CommandLine 重新赋值,可以更深层次的定制当前源码文件的参数使用说明
在init 方法的开头重新定义commandLine
func init() { flag.CommandLine = flag.NewFlagSet("",flag.ExitOnError) flag.CommandLine.Usage = func() { fmt.Fprintf(os.Stderr,"commandLine.Usage %s","question") flag.PrintDefaults() } flag.StringVar(&name,"name","everyone","这个是获取命令输入参数的") }
flag.ExitOnError 是flag 包中定义的常量 告诉菜蔬容器,当命令后跟 --help 或者参数设置不正确的时候,当打印参数使用说明后已状态码2结束当前程序
image.png
我们把参数换成flag.PanicOnError 告诉它程序执行完成后,抛出一个恐慌
func init() { flag.CommandLine = flag.NewFlagSet("",flag.PanicOnError) flag.CommandLine.Usage = func() { fmt.Fprintf(os.Stderr,"commandLine.Usage %s","question") flag.PrintDefaults() } flag.StringVar(&name,"name","everyone","这个是获取命令输入参数的") }
执行命令 go run main.go -help
image.png
自己创建命令参数容器
package main import ( "fmt" "flag" "os" ) var name string var customLine = flag.NewFlagSet("",flag.ExitOnError) func init() { customLine.StringVar(&name,"name","everyone","这个是获取命令输入参数的") } func main(){ customLine.Parse(os.Args[1:]) fmt.Printf("hello world, %s --",name) }
image.png
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 走近源码:Redis 如何执行命令
- Arthas 源码分析(三):命令执行过程
- Go Redigo 源码分析(三) 执行命令
- Cocoapods 源码浅析 - 从 pod 命令开始
- 熔断器 Hystrix 源码解析 —— 执行命令方式
- 走近源码:Redis命令执行过程(客户端)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
面向对象技术UML教程
王少峰 / 清华大学出版社 / 2004-2 / 24.00元
《面向对象技术UML教程》主要介绍统一建模语言UML及其应用。全书内容丰富,包括UML的用例图、顺序图、协作图、类图、对象图、状态图、活动图、构件图和部署图等9个图中所涉及的术语、规则和应用,以及数据建模、OCL、业务建模、Web建模、设计模式、OO实现语言、RUP等方面的内容,同时介绍了Rose开发工具中的一些用法。《面向对象技术UML教程》最后是一个课程注册系统的实例研究,以及一些思考题和设计......一起来看看 《面向对象技术UML教程》 这本书的介绍吧!