咱们只关注框出来的2个源码文件linux
demo5.goui
package main import "flag" //这里须要填写 var name string func init() { flag.StringVar(&name, "name", "everyone", "The greeting object.") } func main() { flag.Parse() hello(name) }
demo5_lib.go3d
package lib5 import "fmt" func Hello(name string) { fmt.Printf("Hello, %s!\n", name) }
执行命令:go build /jikeshijian/q5/libcode
在工做区的pkg目录中生成了归档文件 linux_amd64/jikeshijian/q5/lib.ablog
注意了,源码文件demo5.go中的package声明是lib5,可是这里生成的归档文件名称是lib.a源码
首先,咱们在构建或者安装这个代码包的时候,提供给go命令的路径应该是源码文件所在目录的相对路径。因此上面咱们执行的命令是go build /jikeshijian/q5/lib
而不是go build /jikeshijian/q5/lib5
。string
在demo5.go中咱们注释的地方填入 import "jikeshijian/q5/lib"
it
并把对hello()的调用改成 lib.Hello()
编译
经过运行go run demo5.go命令试一试import
报错了。
第一处是说咱们导入了jikeshijian/q5/lib
这个包,可是没有用到它里面的任何程序实体,这在Go语言是不容许的。编译时就会报错。
as lib5
的意思是虽然咱们导入了jikeshijian/q5/lib
这个代码包,可是在引用程序实体的时候应该以lib5
做为限定符。这也就是第二个错误的缘由了,咱们用的是lib.Hello()
,限定符用错了。Go找不到lib.
这个限定符对应的代码包。
出现这里的错误的根本缘由是:咱们在源码文件里声明所属的代码包和源码文件所在的目录的名称不一样。
源码文件所在的目录相对于src目录的相对路径就是它的代码包导入路径,而实际使用其程序实体时,所用的限定符要和源码文件里声明的代码包名称对应。
咱们包demo5_lib.go的所属代码包改成lib。理由是:咱们老是应该让声明的包名和其父目录的名称一致。
从新编译demo5_lib.go,而后执行以下命令
运行成功。我已经学会了把命令源码文件中的代码拆分到其余代码包。