mac搭建golang开发环境并say hello

  • Post author:
  • Post category:golang


安装

去http://golang.org下载安装包双击安装,不赘述。

安装完毕可以在终端输入go version来确认是否安装成功。

环境变量

1.建一个文件夹:”your path”/”your dir”,并在这个dir下面mkdir三个子文件夹bin,pkg和src,例如我的是 /Users/username/workspace/goProject,那么实际如下所示。bin,pkg和src下面的东西,那些是后面测试时加入的,请假装没看见。

2.vim ~/.bash_profile,按1中情况进行编辑,内容如下,主要是GOPATH需要设置为1中的”your path”/”your dir”:

3.退出.bash_profile执行source ~/.bash_profile,并使用go env命令查看生效否,GOOS=”darwin”是编译在mac上运行的binary,如果是交叉编译linux上运行,则GOOS=”linux”,当然这个可以在makefile里搞:

为什么要先创建src,bin和pkg后source .bash_profile?因为如果反着来,有的时候go env看到的GOPATH会是空,不纠结原因了。

src:存放项目源码,你自己手动放,包括编译成可执行文件的源码和编译成pkg的源码;

bin:存放编译后的可执行文件,go install帮你放;

pkg:存放编译后生成的包文件,go install帮你放,你要自己放也没人拦。

say hello

参考博文

https://blog.csdn.net/zyz770834013/article/details/78656985

GOPATH/src是存放源文件的地方,但是我可能有多个project,没关系,在GOPATH/src下建立不同的project子文件对应不同的project,在这些项目子文件里放各自的go源码文件,像我这样有三个project,分别是helloworld,mytest和mypkg,其中前两者是带main的main package,而mypkg则是没有main函数的pkg。

代码如下:

-------------------------------------------------------------------helloworld/helloworld.go
package main

import "fmt"

func main(){
    fmt.Printf("Hello World!\n")
}
-----------------------------------------------------------------------------mypkg/mypkg.go
package mypkg

import "fmt"

func Myfunc(){
    fmt.Println("mypkg say:我很紧张,而且很害怕

对于src/helloworld下的可执行文件比如helloworld.go:

  1. go run:可在任意路径下执行 go run path/to/helloworld.go,比如直接在src下执行go run helloworld/helloworld.go,也可以在goProject下执行go run src/helloworld/helloworld.go,效果就是编译helloworld.go并执行,但是编译的可执行文件不会保留;go run的参数只能是go文件;
  2. go build:可在任意路径下执行go build path/to/helloworld.go, 比如直接在src/helloworld下执行go build helloworld.go,也可以在goProject下执行go build src/helloworld/helloworld.go,效果就是编译helloworld.go,编译的可执行文件会放在执行目录下,所以,没法在src下执行go build helloworld/helloworld.go,因为编译目标二进制的helloworld和目录helloworld重复,当然可以使的go文件名和目录名不一致,编译结果是和go文件名一致的,比如helloworld/hello.go,在src下执行go build helloworld/hello.go将会在src下生成可执行文件hello;也可执行go build path/to/helloworld,此时可能helloworld下有多个.go文件都属于package main(但是只有一个定义了main函数),此时生成的二进制文件名是和目录helloworld同名的;综上go build的参数可以是go文件也能是目录;还需要注意,参数是go文件时可以指定详细路径,参数是目录时,默认从GOPATH开始找,所以编译目录时不能带path/to/src,而是从src下开始起算路径;
  3. go install:可在任意路径下执行go install path/to/helloworld,会把该路径下的go文件编译出一个可执行文件放在bin下面,但是假设helloworld下面有两个go文件helloworld.go和hello.go都定义了main函数,那么只能go install path/to/helloworld/hello.go这样子;如果helloworld下有多个.go文件都属于package main(但是只有一个定义了main函数),此时生成的二进制文件名是和目录helloworld同名的且放在GOPATH/bin下面;综上go install的参数可以是go文件也能是目录;还需要注意,参数是go文件时可以指定详细路径,参数是目录时,默认从GOPATH开始找,所以编译目录时不能带path/to/src,而是从src下开始起算路径;

对于src/mypkg包,

  1. go run:在任意目录下执行go run path/to/mypkg/mypkg.go都不会有任何卵用的,会提示你pkg不能run;
  2. go build:可在任意目录下执行go build path/to/mypkg/mypkg.go,也能执行go build path/to/mypkg只能测试文件是否能正常编译,不会产生任何结果;综上go build的参数可以是go文件也能是目录;还需要注意,参数是go文件时可以指定详细路径,参数是目录时,默认从GOPATH开始找,所以编译目录时不能带path/to/src,而是从src下开始起算路径;
  3. go install:可以像这样,src/mypkg/mypkg1/mypkg1.go,src/mypkg/mypkg2/mypkg2.go,也就是src/mypkg下有mypkg1和mypkg2两个pkg,然后在任意目录执行go install path/to/mypkg/mypkg1和go install path/to/mypkg/mypkg2,对于pkg文件,看起来对于pkg不能install go文件,只能install目录,这样的效果,会在 pkg/darwin_amd64下面产生mypkg/mypkg.a和mypkg/mypkg2.a,和src下的路径相比,mypkg1和mypkg2两个子路径没有了,也就是说对于pkg来说,install会在GOPATH/pkg下面保留GOPATH/src/xxxpkg这个包顶层目录。还需要注意,参数是go文件时可以指定详细路径,参数是目录时,默认从GOPATH开始找,所以编译目录时不能带path/to/src,而是从src下开始起算路径;



版权声明:本文为haolianglh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。