近日因工作需要,对go语言进行了简单快速了解、学习。过程中go项目组织结构和包相关内容着实令人头晕……
在了解到go build
和go install
时,本人着实钻了一把牛角尖,奈何网上找的参考也不能很好地帮助我解开疑惑。所以,简单记录一下,希望本人粗浅之见能给同样有类似疑问的朋友一些思路。
疑惑点:
看视频的时候up主在讲到go build后提到了一个细节:执行该指令后在目录 %GOPATH/pkg 下会生成.a编译文件,可是照做之后并没有出现一样的结果。why???本可以暂时跳过此问题,但牛角尖一旦出现…时间就被浪费了
进入正题……
-
系统:win10
-
开发环境: VS Code
-
go版本:1.17.8
项目文件结构:
![](https://i-blog.csdnimg.cn/blog_migrate/4eb2d4bbe1dc774a417d108316a8b10e.png)
main.go内容:
package main //将该文件归属到main包中
import (
"fmt"
"github.com/bounci/firstGoProject/utils"
)
func main() {
fmt.Println("Hello World!") // shift+alt+donw快捷复制
fmt.Println("Hello World!")
fmt.Println("Hello World!")
var num = 10 //变量申明
fmt.Println(num)
var n1 float64 = 4.5
var n2 float64 = 7.6
var operator byte = '*'
result := utils.Cal(n1, n2, operator)
fmt.Printf("result=%9.2f", result)
}
utils.go内容:
package utils
import "fmt"
//为了让其他包可以使用Cal函数,需要将C大写,类似其它语言的public
func Cal(n1 float64, n2 float64, operator byte) float64 {
var res float64
switch operator {
case '+':
res = n1 + n2
case '-':
res = n1 - n2
case '*':
res = n1 * n2
case '/':
res = n1 / n2
default:
fmt.Println("操作符错误……")
}
return res
}
浅析go build 和 go install:
-
相同点:
都能编译生成可执行文件(.exe)。 -
差异:
go build
:只能生成可执行文件,编译后生成的有默认名生成的文件在当前目录或在指定目录下,当然,文件名也可以指定,方法如下:
E:\GoProjects> go build -o bin/my.exe github.com/bounci/firstGoProject/main
go install
:可以生成可执行文件、编译包文件(.a),其生成的可执行文件在 %GOPATH/bin 目录下,编译的包存储于*$GOPATH/pkg* 目录下。
![](https://i-blog.csdnimg.cn/blog_migrate/ea4ba4a91ce452a00f8b9afac97b5b76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/be94c7cc696532e0517461b8c7ede6a6.png)
关于运行go install后在 pkg中未生成文件的问题,做的一些尝试:
- 如果只对
main包
所在路径进行操作,在会在bin目录下生成.exe文件,不会在pkg目录生成编译文件。 - 对其他包(非main)进行该操作,则会在pkg下生成相应的.a文件。
- 经过测试,使用
go install
时无论定位到GOPATH还是*%GOPATH/src目录,均未报错,且都会在%GOPATH/pkg*下生成.a文件。 - 对
非main包
也可以使用go install
命令,不会报错,但没有明显的效果,不会生成任何文件。 - 想测试能否同时达到生成两种文件的目的,出现以下情况,应该是不允许操作多个文件夹。
![](https://i-blog.csdnimg.cn/blog_migrate/3a3cdfc7e961aba702a7de2b96c95cc5.png)
最后,为什么确实运行了go install
,但是只生成了可执行文件,在pkg中什么也没有。自我猜测原因:运行的是main包,所以没有过程文件。