前文再续,书接上回,前一篇:兔起鹘落全端涵盖,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 就是这个时代的一阳指,内功心法上借鉴了六脉神剑,将内力灌注于指端,亦能隔空伤人,然而入门的门槛更低,就算没有武学根底的小白也能够进行修炼,练成之后,性能和威力却不逊于六脉神剑,具体心法如何,且听下回分解。