How to run Go code
GOROOT & GOPATH
GOROOT就是go的安装路径。用homebrew的话会自动设置好。
GOPATH有两个用途:存放binaries,以及存放自己的代码。
homebrew安装的话会自动将GOPATH设置为~/go
。~/go
的bin文件夹包含了下载的 & 自己install的binaries。另一个pkg文件夹,目测是通过go modules来管理bin文件夹中的binaries。
我自己再开了一个新目录存放自己的代码,比如叫~/gocode
。我只要把这个路径用冒号加到GOPATH变量就行了。
gocode
目录如下:
也要创建bin, pkg, src三个文件夹。至于.mod文件下面会提到。
Go Package & Module
https://learnku.com/go/t/27649
go的package和java差不多,都是组织代码的单位。
有几个要注意的:
-
一个package只能有零或一个main方法,即为package的入口。包含该方法的文件必须在开头写上
package main
.执行
go install <package>
命令后,系统会尝试在指定的包目录里寻找带有 main 包声明的文件。找到之后,Go 就知道这是可执行的程序,需要被编译为二进制文件。一个包里可以有很多文件,但是只能其中一个文件里有 main 函数,标志着这个文件是程序的入口文件。如果一个包中没有带有 main 包声明的文件,那么,Go 就会在 pkg 目录中创建一个 包管理 (.a) 文件。
-
不管是变量还是函数,开头是大写的话就代表是export的,其他包也可以访问。不然只有包内可以访问。
-
使用
go install
可以将当前package打包到bin目录中,避免重复编译。 -
Module是Go 1.13后的新功能。module的语义是“一个项目/应用”,一个module可以包含很多package。所以看上图,如果我们的应用是
github.com/yuhengfdada/test
, 那么我们就在这个目录下执行go mod init
,就会有一个.mod
文件。里面可以配置这个项目/应用的元信息。
碰到的问题
在上图中,我试图在test.go中import greet包,但是显示package greet is not in GOROOT (/usr/local/Cellar/go/1.17.6/libexec/src/greet)
。解决方法是执行go env -w GO111MODULE=off
。
总结
从零创建go应用,建议直接跟着这篇官方文章做:
https://go.dev/doc/code
基本涵盖了上文的内容。