go语言学习(三):源码文件
go语言的源码文件包括命令源码文件、库源码文件和测试源码文件。
命令源码文件是程序执行的入口,属于main包,包含无参数无返回结果的main函数,同java类似,同一个包下面不建议存放多个main函数。命令源码文件编译或安装后生成可执行文件,存在当前执行命令的目录下。
库源码文件用于存放供其他代码使用的程序实体,构建时进行检查和验证,生成临时文件,安装时生成归档文件,存放在当前工作区的pkg目录。
测试源码文件主要存放测试相关的源码文件,包括功能测试、性能测试、程序运行示例等。
下面详细讲一下命令源码文件和库源码文件:
1.命令源码文件
1)代码1
//Demo1.gopackage main
import "fmt"func main() { fmt.Print("hollo world!")}
如上代码,我们在IDE中执行run操作,或者在命令行执行go run Demo1.go
2)命令源码文件怎么接受参数呢?go语言中的fla代码包专门用于接受和解析命令行参数,如下面代码:
package main
import ( "flag" "fmt")
var name string
func 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 main
import ( "flag" "fmt" "os")
var name string
func init(){ flag.CommandLine = flag.NewFlagSet("", flag.PanicOnError) flag.CommandLine.Usage = func() { fmt.Fprintf(os.Stderr, "Usage of %s:n", "question") flag.PrintDefaults() } flag.StringVar(&name, "name", "everyone", "The greeting object.")}func main() { 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 main
import ( "flag" "fmt" "os")
var name string
var 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.go
package mainimport "fmt"//定义方法func printHello(name string) { fmt.Printf("Hello, %s!n", name)}
//Demo5.gopackage main
import ( "flag" "os")
var name string
var 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 lib
import "fmt"
//定义方法func PrintHello(name string) { fmt.Printf("Print Hello, %s!n", name)}
//Demo5.gopackage main
import ( "demo2/lib" "flag" "os")
var name string
var 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 demo2lib
这时候就会生成一个归档文件,接着编译和运行
e)在上面Demo6.go中的程序实体改为了大写,这样就可以被包外的程序引用,如果是小写,只能被包内的程序引用。
f)go语言支持package声明和所在目录不同,但是为了让代码清晰不产生误会,建议这2个名称保持一致
g)在一个模块中声明internal的代码包,可以仅让当前代码包中使用,包括internal代码包的直接父包和子包,不支持其他模块中的代码包引用。
代码地址:https://github.com/jinjunzhu/mygolang.git
- 海量数据迁移之分区并行抽取(r2笔记53天)
- 海量数据迁移之外部表切分(r2笔记52天)
- 怎样突破表名30个字符的限制(r2笔记51天)
- C/C++——排序
- 关于move tablespace的问题总结(r2笔记50天)
- 一些极度危险的linux命令(r2笔记49天)
- 挑战数据结构与算法面试题——80题全解析(一)
- 关于操作失误的数据修复(r2笔记48天)
- 挑战数据结构与算法面试题——80题全解析(三)
- 巧用rowid简化sql查询(r2笔记47天)
- 算法类面试题解析——美团2016校招:棋子翻转
- 算法类面试题解析——美团2016校招:最大差值
- 用Python进行机器学习小案例
- 启用ODM极速调优IO (r2笔记66天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法