这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
GOPROXY:
golang是由很多模块组装而成,goproxy即表示这些模块下载的原,学过类似于Java的repository源、nodejs的npm源、C#的nuget源,可以选择切换成七牛的goproxy,切换方式:goproxy.cn,你可以在没有VPN的情况下体验下飞一般的感觉
GOMODCACHE:
go mod是一个很好的包依赖管理工具,开启go mod之后,可以使用go mod init [项目名称]去初始化一个项目,这个时候会在根目录下生成:go.mod,在进行run或者build的时候,就会根据go.mod里包的顺序去加载;
GOROOT:
这个是Go的安装目录,类似于Java的jdk的安装目录;
GOPATH:
GOPATH是我们的工作空间,保存go项目代码和第三方依赖包(据说go的早期版本需要将代码放置到该目录下,或者手动配置每个项目的GOPATH,相对不是很灵活,当然现在不用哈)
项目启动:
使用go run开始启动demo了。这时候我们使用的是
go run main.go version
version可以理解为我们的子项目名称;当然,我们也可以直接
go run main.go
这时候我们的root.go需要改成以下内容:
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var (
rootCmd = &cobra.Command{
Use: "cobra",
Short: "A generator for Cobra based Applications",
Long: `Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello World,Goblin ,--default")
},
}
)
func init() {
rootCmd.AddCommand(versionCmd)
// rootCmd.AddCommand(serverCmd)
}
// Execute executes the root command.
func Execute() error {
return rootCmd.Execute()
}
我们对于var {}中的rootCmd增加了Run方法以及实现,输出了“Hello World,Goblin ,--default”,此时,我们直接运行 go run main.go,那么编译器会先执行main函数,cmd是包名(文件夹名称),会找到这个文件夹下的Execute()方法,这个方法中会去执行rootCmd,由于启动参数没有指定子模块,此时会执行默认模块,即“cobra”。
当然,我们在root.go中定义了rootCmd,其中的Use就是启动参数,如果我们启动的时候指定Use的模块,比如:“version”,那就会执行add.go中的versionCmd了
Golang执行流程
上述两种执行流程的方式区别
在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件 变大了很多。
- 如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环境的机器上,仍然可以运行
- 如果我们是直接go run go源代码,那么如果要在另外一个机器上这么运行,也需要go 开发环境,否则无法执行。 go run运行时间明显要比第一种方式 长一点点