go语言的源码文件包括命令源码文件、库源码文件和测试源码文件。

       命令源码文件是程序执行的入口,属于main包,包含无参数无返回结果的main函数,同java类似,同一个包下面不建议存放多个main函数。命令源码文件编译或安装后生成可执行文件,存在当前执行命令的目录下。

        库源码文件用于存放供其他代码使用的程序实体,构建时进行检查和验证,生成临时文件,安装时生成归档文件,存放在当前工作区的pkg目录。

        测试源码文件主要存放测试相关的源码文件,包括功能测试、性能测试、程序运行示例等。

下面详细讲一下命令源码文件和库源码文件:

1.命令源码文件

1)代码1

如上代码,我们在IDE中执行run操作,或者在命令行执行go run Demo1.go

2)命令源码文件怎么接受参数呢?go语言中的fla代码包专门用于接受和解析命令行参数,如下面代码:

package mainimport ("flag""fmt")var name stringfunc init(){flag.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {flag.Parse()fmt.Printf("hollo, %s!\n", name)}

上面的代码中,flag.StringVar中有四个参数,分别是命令行参数地址,命令行参数名称,默认输出值,参数说明,在调用命令行参数之前必须对其解析,如上面flag.parse

3)自定义命令源码文件的参数使用说明

package mainimport ("flag""fmt""os")var name stringfunc init(){flag.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {flag.CommandLine.Usage = func() {fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")flag.PrintDefaults()}flag.Parse()fmt.Printf("hollo, %s!\n", name)}

上面的PanicOnError是其中类型,总共有3种error类型,看下面源码定义:

const (  ContinueOnError ErrorHandling = iota // Return a descriptive error.  ExitOnError                          // Call os.Exit(2).  PanicOnError                         // Call panic with a descriptive error.)

执行命令和结果见下图:

4)自定义命令参数容器,可以更加灵活地定义命令行参数

package mainimport ("flag""fmt""os")var name stringvar cmdLine = flag.NewFlagSet("question", flag.ExitOnError)func init(){cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {cmdLine.Parse(os.Args[1:])fmt.Printf("hollo, %s!\n", name)}

2.库源码文件

库源码文件是不能直接运行的文件,只能被其他程序使用。go语言中,如果当前文件要使用某个文件中声明的函数,需要跟这个文件在同一个包下面。

看下面2段代码:

//Demo6.gopackage mainimport "fmt"//定义方法func printHello(name string) {  fmt.Printf("Hello, %s!\n", name)}

//Demo5.gopackage mainimport (  "flag"  "os")var name stringvar cmdLine = flag.NewFlagSet("question", flag.ExitOnError)func init(){  cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  cmdLine.Parse(os.Args[1:])  printHello(name)}

运行如下命令:

注意上面的命令,是同时运行Demo5和Demo6。还有一种方式就是把这2个文件放到一个包下,编译后执行。目录结构如下:

在命令行执行go build demo1,会产生demo1.exe文件,然后运行这个可执行文件,输出:"Hello, everyone!",如下图:

   

注意:

a)工作目录mygolang一定要配置到GOPATH环境变量中,否则会报下图错误;

b) 同一包下面的源码文件要声明同一个代码包。如果包下面有命令源码文件,那其他种类的源码文件也要声明为所属main包。

c)源码文件的代码包声明可以跟所在目录不一样,但是如果build一个代码包,产生的结果同代码包名称相同。如上面的示例

配置好环境变量:

d)如果修改包目录结构,如下图:

//Demo6.gopackage libimport "fmt"//定义方法func PrintHello(name string) {  fmt.Printf("Print Hello, %s!\n", name)}

//Demo5.gopackage mainimport (  "demo2/lib"  "flag"  "os")var name stringvar cmdLine = flag.NewFlagSet("question", flag.ExitOnError)func init(){  cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  cmdLine.Parse(os.Args[1:])  lib.PrintHello(name)}

这种情况下,Demo5.go要依赖Demo6.go的文件,需要先安装一下lib包,go install demo2\lib

这时候就会生成一个归档文件,接着编译和运行

e)在上面Demo6.go中的程序实体改为了大写,这样就可以被包外的程序引用,如果是小写,只能被包内的程序引用。

f)go语言支持package声明和所在目录不同,但是为了让代码清晰不产生误会,建议这2个名称保持一致

g)在一个模块中声明internal的代码包,可以仅让当前代码包中使用,包括internal代码包的直接父包和子包,不支持其他模块中的代码包引用。

 

©著作权归作者所有:来自51CTO博客作者朱晋君的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. CF卡里面的文件名目录名或卷标语法不正确也打不开文件的寻回办法
  2. I/O模型和Java NIO源码分析
  3. go学习笔记(二):go语言工作区介绍
  4. 打造一款 刷Java 知识的小程序(二)
  5. Netty源码剖析与实战
  6. 杀软对抗:一个面向***工程师的杀软绕过思路分享(含实现代码)
  7. 容器 - Web服务示例(6)
  8. 【OCP最新题库解析(052)--题6】Which structure can span multip
  9. 【等待事件】System I/O类 等待事件(3.2)--control file parallel

随机推荐

  1. 图片压缩
  2. Android:BroadcastReceiver
  3. android 异常 记录
  4. Android zip、tar+gz 压缩解压
  5. Android Code name Version API level
  6. android internals
  7. Android RSA 公钥加密、解密
  8. //转//Revisiting Android disk encrypti
  9. Android生命周期实验
  10. Android选择一段日期