创建您的第一个Golang应用程序
通过Homebrew安装GoLang
GOPATH vs GOROOT
安装成功会自动生成两个目录:
GOROOT ( /usr/local/go ): 该目录存放了Go的源码。Homebrew 将会为你自动注册该目录到计算机,
GOPATH(/Users/toddbirchard/go):与大多数编程语言不同,go的所有项目和依赖项都应该存在于一个名为GOPATH的目录中。每当我们开发Go项目或安装第三方模块时,所有的操作最终都会发生在这个目录中。
为了确保OSX能够识别GOPATH,我们必须将它添加到shell的启动脚本中。打开.bashrc、.zshrc或您使用的任何文件:
接下来会添加基础目录和子目录
保存修改,然后重新打开shell:
现在我们来检查安装:
最后我们再确认一下我们的GOPATH被识别成功了:
解剖GOPATH
Golang的GOPATH是一个目录,您的所有Go代码和项目依赖项都位于其中。go CLI实际上有一个内置命令$go help gopath,它很好地解释了这一点:
GO路径用于解析导入语句
它由go/build包实现并记录在其中。
GOPATH环境变量列出查找Go代码的位置。
与Python在Python路径中查找导入库的方式类似,Go在GOPATH中搜索相同的库。Python和Go路径之间的一个显著区别是Go希望所有的Go项目都位于GOPATH中,特别是/Go/src。这与Python相比,Python的项目可以在任何地方运行。
GOPATH由三个子目录构成:
src:
src目录保存源代码。src下面的路径确定导入路径或可执行文件名。
pkg:
pkg目录保存已安装的包对象。
与Go目录树一样,每个目标操作系统和体系结构对都有自己的pkg子目录(pkg/GOOS_GOARCH)。
bin:
bin目录保存已编译的命令。
每个命令都以其源目录命名,但仅以最后一个元素命名,而不是以整个路径命名。
简而言之,您的个人源代码属于/src,安装的第三方软件包将位于/pkg中,扩展go-CLI的第三方命令将位于/bin中。举个例子,我的路径是这样的:
我们应该能够很容易地将其分解。
/bin:包含我以前安装的两个Go命令。golint是Go的第三方linter,而“tour”是官方Go漫游的本地版本,帮助Go新手学习他们的语言(顺便说一句,我强烈建议完成这项工作)。
/pkg:包含我安装的软件包。请特别注意/pkg/mod,您可以看到我在/Github.com目录下安装了几个来自Github的软件包。这些包包括dataframe go,它是Pandas-like DataFrames的go实现,以及mux,它是我们将在第一个hello world项目中使用的HTTP路由器。
/src:有三个项目我已经做过了。golang helloworld是我们将在本教程中创建的项目。
GoLang 关键字
在开始编码之前,让我们先复习一些基本的围棋词汇:
Package:Go程序由“包”组成,它反映了其他编程语言中的包概念(想想Python中的模块或Java中的包)。每个Golang程序都包含一个名为main的包,它是项目的入口点。
Module:Go模块是由Go安装的第三方库。模块本质上是已发布的项目,作为项目中的依赖项一般使用。
Vendors:这就是事情变得有趣的地方。虽然模块可以安装到/pkg/mod目录以供全局使用,但源项目可以包含它们自己的模块版本,以避免项目之间的依赖关系版本冲突(这与Python虚拟环境没有什么不同)。虽然不是必需的,但您可以选择保持模块版本特定于项目(我们将在示例中这样做)。
创建一个Hello World 应用程序
说了这么多,接下来我们创建第一个golang应用程序,保存目录如下/go/src:
在新的项目目录中,我们现在将把项目初始化为Go模块。这意味着任何人都可以在Github上安装我们的Go代码,如果他们愿意的话。我知道我要将我的仓库保存到github.com/hackersandslackers/golang-helloworld,因此我们运行以下程序:
完成此操作后,一个名为go.mod的新文件将出现在您的目录中。使用$cat go.mod查看内容,查看它的初始化:github.com/hackersandslackers/golang-helloworld,因此我们运行以下程序:
到目前为止都很简单!go.mod包含其他人关于我们模块的信息,例如模块名称和它的目标版本。当我们为项目安装依赖项时,这些依赖项及其各自的版本将存储在这里。
main.go
如前所述,每个Go项目的入口点都是一个名为main.Go的文件。我们将创建最简单的main.go文件:他将输出"Hello, world."
:
现在请记住:因为Go是一种编译语言,所以我们需要先构建项目,然后才能运行它😮:
大功告成!我们刚刚在Go中创建了第一个“hello world”应用程序。您的项目结构现在应该如下所示:
新创建的golang helloworld文件是每次运行$go build时创建的已编译可执行文件。每次对源代码进行更改时,我们都应该再次运行$go build以使用更改重新生成此可执行文件。
代码格式:
Go中的一个漂亮工具是一个代码格式化程序,可以清理源代码中的任何丑陋缩进等。尝试在main.go中弄乱缩进并运行以下操作:
这将修复输出文件名中所有难看的格式,在我们的例子main.go中。
创建一个Web应用程序
虽然我们已经成功地建立了Golang,学会了第一个应用程序“Hello,world”,但我们还没有学到很多有用的东西。是时候让我们的应用程序成为一个可以通过浏览器提供服务的web应用程序了。
添加第一个依赖
为了通过web服务器提供Go代码,我们将利用非常流行的gorilla/mux模块:一个轻量级的请求路由器和调度器,用于将传入的请求与各自的处理程序进行匹配。https://github.com/gorilla/mux
通过运行$go get,然后运行$go install来安装:
go get将gorilla/mux的源代码安装到我们的/go/bin目录中。-u标志是一个“更新”标志,我们用它获取最新版本。
让我们看看运行$cat go.mod对go.mod的影响:
我们的模块依赖项现在已经添加到go.mod中,并带有正确的版本号。现在我们可以导入并使用github.com/gorilla/mux来帮助我们构建一个项目!
我们还可以使用$go mod vendor在/vendors文件夹中构建本地此依赖项。下面是一堵代码片段,它将我们的hello world应用程序转变为web应用程序:
这里的函数是main()、router()和handler(),它们按该顺序执行。
main()
main()将HTTP服务器设置为在端口9100上本地提供服务,并将读写超时设置为最佳实践的一种形式。如果没有任何路由需要解决,我们的服务器本身就做不了多少事情。这就是我们的router()函数的作用。
router()
我们通过使用r := mux.NewRouter()创建变量r来初始化“路由器”。在此基础上,我们可以使用以下语法设置任意多个路由:
HandleFunc()是解析URL路由的内置方法。第一个参数是目标URL,第二个参数是当用户请求所述路由时要执行的函数的名称。在我们的示例中,我们只指定了一条路线,但理论上我们可以设置任意数量的路线,例如:
handler()
默认情况下,Mux处理程序函数始终接受两个参数,它们基本上解析为输出和输入。w http.ResponseWriter需要一个名为w的参数,其类型为http.ResponseWriter,这是我们返回以向最终用户呈现内容的参数。r *http.Request包含有关用户请求的信息,保存到名为r的参数中。
我们就简单点,因此我们只简单演示输出“hello world”消息的方法:
使用$go build和$go run main.go重新构建并运行我们的项目。现在尝试在浏览器中访问本地IP(127.0.0.1:9100):
成功了
下面讲解一下语法:
“Export”方法(又名:公共与私有)
几乎每种编程语言都有“私有”与“公共”函数的概念。Go也有关于包之间共享函数的概念。“共享”的方法称为“导出方法”(参考JavaScript)。
如果名称以大写字母开头,则导出方法名称。我们的helloworld示例只包含私有函数(这很有意义,因为我们只有一个包)。如果我们想让其他包可以访问我们的router()函数,我们只需要将其重命名为Router()。
类型声明
Go期望变量、传入函数参数和函数返回值具有声明的类型。在下面的示例中,函数add()接受两个整数并将它们相加,这无疑会产生一个整数:
变量使用与函数参数相同的语法进行设置,变量名称排在第一位:
还有一种通过逗号分隔变量名来设置相同类型的多个变量的速记方法。在这种情况下,变量x、y和z被设置为无赋值的整数:
赋值语句
Go的一个非常酷的特性是 := 操作符。“short assignment”操作符可用于使用隐式类型一次设置多个变量。这意味着Go将根据分配的值自行解析每个变量的类型,而无需显式类型声明。下面的示例创建三个变量,其中x和y解析为布尔值,z解析为字符串:
常量
https://github.com/hackersandslackers/golang-helloworld
好吧,就写到这里,创作不易,麻烦点个赞,我们今天创建的存储库位于Github上:
- 点赞
- 收藏
- 关注作者
评论(0)