前文再续,书接上回,前一篇:兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00,咱们搭建起了Go lang1.18的开发运行环境,接着就能够运行第一个Go lang1.18程序了,让咱们整装待发,开启Go lang1.18的处女航。
首次运行
关上Sublime 4,在任意目录下新建test.go文件:
package main // 申明 main 包 import "fmt" // 导入 fmt 包,打印字符串时须要用到 func main() { // 申明 main 主函数入口 fmt.Println("hello Go lang 1.18") // 打印 字符串}
随后按快捷键组合 control + b 运行程序 (Mac平台应用cmd + b)
程序返回:
> Environment: > GOPATH=C:/Go > Directory: C:\Users\liuyue\www\tornado6 > Command: C:/Go/bin\go.exe run -v C:\Users\liuyue\www\tornado6\test.go > Output: command-line-arguments hello go1.18 > Elapsed: 3.070s > Result: Success
和Python或者Ruby这些解释型语言不同,Go lang和Java一样,是编译型语言,运行之前须要编译成可执行文件后能力执行,而 go run命令会编译源码,并且间接执行源码的 main() 函数,不会在当前目录留下可执行文件。
能够看到Sublime帮咱们执行了go run命令,如果违心,能够在终端间接执行编译运行命令:
C:\Users\liuyue\www\tornado6>go run test.go hello Go lang 1.18
成果是一样的。如果须要独自编译成可执行文件,能够应用go build命令:
C:\Users\liuyue\www\tornado6>go build test.go C:\Users\liuyue\www\tornado6>dir test.go test.exe
代码解析
首先Go lang反对用//在代码中加一些阐明和解释,不便本人或其余程序员程序员浏览代码,可能大大加强程序的可读性:
fmt.Println("Hello,Go lang1.18") // 左边的所有内容当做阐明,而不是真正要执行的程序,起辅助阐明作用
也反对应用/**/多行正文:
func main() { /* 以下代码都是将信息打印在屏幕上 */ fmt.Println("Hello Go lang 1.18") }
go run命令在编译代码时,会疏忽正文的内容。如果你写的一些测试代码不想让计算机执行,那么也能够加上正文。
Go lang以package(包)作为模块治理单位,每个 Go lang源文件必须先申明它所属的包,所以咱们会看到每个 Go 代码的结尾都有一个 package 申明:
package main // 申明 main 包
Go lang的package与目录是对应的,它具备以下几点个性:
1.一个目录下的同级文件属于同一个package。
2.package名称能够与其所在目录名不同。
3.main 包是 Go lang程序的入口包,一个 Go 语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无奈生成可执行文件,这一点因循了C语言的个性。
在申明了以后文件的package之后,咱们也能够为程序导入须要的工具包,比方:
import "fmt" // 导入 fmt 包,打印字符串时须要用到
这一点和Python相似,你想用什么,就能够import什么,fmt 包是 Go lang 内置的零碎规范库。应用它能够格式化输入输出的内容,相似的零碎内置包还有 os 、io 等等。
导包的时候还有一些神通广大,比方:
import . "fmt" // 导入 fmt 包,打印字符串时须要用到
这个点操作的含意就是这个包导入之后在你调用这个包的函数时,你能够省略前缀的包名,也就是后面你调用的fmt.Println("hello world")能够省略的写成Println("hello world")
和Python相似,包能够本人申明别名:
import f "fmt" // 导入 fmt 包,打印字符串时须要用到
别名操作的话调用包函数时前缀变成了咱们的前缀,即f.Println("hello world")。
还能够在导包的时候主动初始化对象:
import _ "github.com/ziutek/mymysql/godrv"
\_ 操作是引入该包,而不间接应用包外面的函数,而是调用了该包外面的init函数。
但须要留神的是,导入的包外面不能含有代码中没有应用到的包,否则 Go 编译器会报编译谬误,例如 imported and not used: "os",换句话说,你用到什么就导什么,不必就别导,和自助餐厅里吃多少拿多少的含意是一样的。
和Python相似,Go lang也能够应用一个 import 关键字导入多个包,此时须要用括号( )将包的名字包围起来,并且每个包名占用一行,也就是写成上面的样子:
import( "fmt" "os" )
main办法是 Go lang程序的入口办法,有点相似Python中的 if \_\_name\_\_ == '\_\_main\_\_',即程序启动后运行的第一个办法。main办法只能申明在 main 包中,不能申明在其余包中,并且,一个 main 包中也必须有且仅有一个 main 办法。
同时,main办法也是自定义办法的一种,在 Go lang中,所有办法都以关键字 func结尾的,定义格局如下所示:
func 函数名 (参数列表) (返回值列表){ 函数体 }
须要留神的是,Go lang的写法没有那么随性,左大括号{必须和函数名称在同一行,否则会报错。
fmt.Println()办法是 fmt 包中的一个内置办法,它用来格式化输入数据,比方字符串、整数、小数等。这里咱们应用 Println 函数来打印字符串。留神,Println 函数打印实现后会主动换行,ln 是 line 的缩写。
对于GOPATH工作目录
网上很多教程都是基于gopath模式来解说,gopath目录构造如下
-- bin 寄存编译后生成的二进制可执行文件
-- pkg 寄存编译后生成的 .a 文件
-- src 寄存我的项目的源代码,能够是你本人写的代码,也能够是你 go get 下载的包
将本人的包或者他人的包全副放在 $GOPATH/src 目录下进行治理的形式,咱们称之为 GOPATH 模式。
但事实上是,从 go lang 1.11 开始,go env 多了个环境变量: GO111MODULE ,这里的 111,其实就是 v1.11 的版本标识,GO111MODULE 是一个开关,通过它能够开启或敞开 go mod 模式。
它有三个可选值:off、on、auto,默认值是auto。
GO111MODULE=off ,禁用模块反对,编译时会从GOPATH和vendor文件夹中查找包。
GO111MODULE=on ,启用模块反对,编译时会疏忽GOPATH和vendor文件夹,只依据 go.mod下载依赖。
GO111MODULE=auto,当我的项目在$GOPATH/src外且我的项目根目录有go.mod文件时,主动开启模块反对。
go mod 呈现后,GOPATH 正在被逐渐淘汰,根本没人用了。
这也解释了为什么上一篇文章中咱们须要手动开启go mod:
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
如果您是go lang 1.18的初学者,那么就能够遗记GOPATH,齐全投入go mod的怀抱,但如果您手头还保护着低版本的go lang我的项目,那么就应该将GO111MODULE 置为 off。
结语
Go lang 能够被认为是次时代的C语言,进行类比的话,如果说远古时代的C语言是绝世神功六脉神剑,六脉齐发,隔空伤人,性能无敌,然而门槛太高,现代人曾经无奈修聚到惊世骇俗的内力来催动这种剑气绝学,那么Go lang就是这个时代的一阳指,内功心法上借鉴了六脉神剑,将内力灌注于指端,亦能隔空伤人,然而入门的门槛更低,就算没有武学根底的小白也能够进行修炼,练成之后,性能和威力却不逊于六脉神剑,具体心法如何,且听下回分解。