入门10_包导入

Golang包导入一些问题

编译时使用的是包源码还是.a

使用第三方包的时候,当源码和.a均已安装的情况下,编译器链接的是源码。
那么是否可以只链接.a,不用第三方包源码呢?我们临时删除掉libproj1目录,但保留之前install的libproj1/foo.a文件。
我们再次尝试编译app1,得到如下错误:

1
2
3
4
$go build app1
main.go:5:2: cannot find package "libproj1/foo" in any of:
/Users/tony/.Bin/go14/src/libproj1/foo (from $GOROOT)
/Users/tony/Test/Go/pkgtest/src/libproj1/foo (from $GOPATH)

编译器还是去找源码,而不是.a,因此我们要依赖第三方包,就必须搞到第三方包的源码,这也是Golang包管理的一个特点。
所谓的使用第三方包源码,实际上是链接了以该最新源码编译的临时目录下的.a文件而已。
Go标准库中的包也是这样么?对于标准库,比如fmt而言,编译时,到底使用的时$GOROOT/src下源码还是$GOROOT/pkg下已经编译好的.a呢?、找不到fmt包了。显然标准库在编译时也是必须要源码的。不过与自定义包不同的是,即便你修改了fmt包的源码(未重新编译GO安装包),用户源码编译时,也不会尝试重新编译fmt包的,依旧只是在链接时链接已经编译好的fmt.a

目录名还是包名?

答:目录
Go language specification中关于import package时列举的一个例子如下:

1
2
3
4
5
Import declaration          Local name of Sin

import "lib/math" math.Sin
import m "lib/math" m.Sin
import . "lib/math" Sin

我们看到import m “lib/math” m.Sin一行。我们说过lib/math是路径,import语句用m替代lib/math,并在代码中通过m访问math包中的导出函数Sin。

参考

理解Golang包导入:https://studygolang.com/articles/3189

go入门系列
入门02_IDE安装
入门03_工具链
入门04_入门demo和基本类型
入门05_go升级版本
入门06_教程biancheng
入门08_教程编程时光
入门09_Go语言高级编程
入门10_包导入
入门11_方法接口和嵌入类型
入门12_数组和切片

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×