前言
每次新建项目,不熟悉go的项目结构,一般跑都跑不起来,每次都要重新搞一遍,好几回跑项目都会报类似File is invalid
的错误
有时候报其他奇怪的错误,今天就下决心整理一下,理一理概念 GOROOT、GOPATH、src、 pkg、bin,希望以后不要再出现这样的问题了,同时给看到文章的你一些帮助。
熟悉golang项目目录结构
要想让你的程序跑起来,要按照这样的目录结构,正常情况下有三个目录:
|--bin
|--pkg
|--src
其中,bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。一般,bin和pkg目录可以不创建,go命令会自动创建(爽否?),只需要创建src目录放代码即可。
我创建一个src
目录,下面再创建一个叫main
的项目(可以叫任何名字,我只是示例叫main
),里面只有一个main.go
文件。
他的内容是:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
这样一个简单的项目就创建好了,创建好只是第一步,下面让她跑起来。
让她跑起来
找到配置,Goland
里面大多数的配置都在这里。
配置你的GOROOT
,配置成你安装的go
路径,Goland
会自动识别,这就是GOROOT
的作用,和JAVA_HOME
的作用差不多。
配置GOPATH
,你的项目放在src
下面不是随随便便就放的,得让go知道你这些个项目基于哪个位置。
细心的人注意到,这里有一个Project GOPATH
,还有一个Global GOPATH
,把你的项目配置在Project GOPATH
里,每个项目都不一样,创建另一个项目时这个路径要配置成新项目的。
Global GOPATH
可以弄一个公共项目,以后就把第三方的包直接装到这里,就可以自动在你的项目里引用了。
调出ToolBar
,开始配置运行文件
在ToolBar
中Add Configuration
创建一个go build
,可以看到有一个go remote
的选项,它是用来调试远程服务器上的代码的,有兴趣关注我,我后续更新。
注意这三个位置,
选File
,运行文件就选main
函数所在在文件main.go
,输出文件夹就在和src
同级目录的bin
文件夹(自动创建),Working directory
目录就是刚刚设置GOPATH
的目录(自动)
注意,如果你多次打开目录选择,框框里的目录不会被替换掉,而是追加,导致运行的时候报错,除非你想一次性编译多个项目。
例如这样:
/Users/pzqu/Documents/code/go/what_go/src/main/main.go|/Users/pzqu/Documents/code/go/what_go/src/main/main.go
点击OK保存,之后,在ToolBar
上点击运行,旁边那个符号是debug
成功运行!自动创建了bin
目录
如果你想改输出的二进制文件名,可以在这里添加参数-o bin/main
如何在一个项目中使用其他项目?
引用自己的项目中的其他模块包
写一个新函数func Add(a, b int) int
,放在src
下面main
项目,calc
文件夹,add.go
文件里
|____src
| |____main
| | |____calc
| | | |____add.go
| | |____main.go
代码如下
package calc
func Add(a, b int) int {
return a + b
}
在main
函数中调用他
输出结果:
几个点需要注意:
add.go
中的Add函数名首字母必须大写, 比如Add, Addxxx.只有大写的才是Public权限,外面的包才能访问,否则只能自己文件夹下代码才能访问add.go
的改名为addyyy.go也可以,查找add包的时候,并不会根据add.go这个文件名来查找。而是根据文件夹名来查找,一个文件夹下的所有文件都属于同一个包。所以函数变量自然不能重复。main
中调用add.Add(1,2)时,add是包, 必须跟add.go
中的package
处的包名一致,否则报错。import后, 怎么去查找对应的包呢?思考一下, 很简单,无非就是GOROOT和GOPATH. 也应该明白了, src这个目录名可不是能随便取的。
引用第三方项目
自己写的其他项目引入,比如我这有一个叫common
的公共包,你的公司有可能把很多go
包下载下来,做一个公共仓库,方便公司内网隔离。
代码很简单
package dance
import "fmt"
func WhoDance() {
fmt.Println("you")
}
在main
里面调用
package main
import "common/dance"
func main() {
dance.WhoDance()
}
输出
you
Process finished with exit code 0
还有一个相当好用的引用第三方项目的工具,vendor
关注我的博客,我们后续再见。
有疑问加站长微信联系(非本文作者)