前言
了解Go语言之前,先说明几个概念:
值、字面量、表达式、语句。
- 值:就是直接的值,像数字:1,字符串"hello"。
- 字面量:就是直接的值。
- 表达式:包含在语句中,根据某种条件计算出一个值,然后由语句去判断和处理的代码。一个表达式会产生一个值。
- 语句:语句是可以单独执行的、能够产生实际效果的代码;语句可以理解成一个行为.循环语句和if语句就是典型的语句.一个程序是由一系列语句组成的.
一些基础可以通读一遍go语言圣经。这里只对一些重要的部分做一些着重说明。
包和文件
Go语言支持模块化、封装、单独编译、和代码重用。
所以Go语言引入了包这个概念。
包可以看做是放在同一个文件夹下的一组源文件。这些源文件都以.go为后缀,都以package 包名
作为文件的开头。同一文件夹下的都以相同包名开头的源文件我们认为属于同一个包。
一般这个包用来生成可执行文件的话,它需要写成package main
,只有package main
的包才会被编译成可执行文件。
不是package main
的包都可以认为是依赖包,被需要编译成可执行文件的包引用。
func main
作为可执行文件的唯一入口函数,其他函数都被main函数直接或者间接调用。
func init
作为初始化函数,在main函数调用之前调用,完成一些初始化。init函数可以有多个,可以分布在多个源文件中。
执行流程
go mod
go modules其实就是Go语言中包的集合。
go mod工具是Go语言中依赖包的管理工具。
go mod给你的项目定义出模块的概念,将所有依赖包放在同一模块下,方便我们模块化自己的代码。
其中vendor目录用于把所有的第三方依赖包放在里面,用来单独控制依赖的版本。
go mod出现之前,我们编写的go源码必须放在gopath下。不过自从出现了go mod以后,我们的源码可以放在任意你喜欢的位置。记得配置好goproxy。
实例
实例1:一个本地可执行文件包
任意找一个文件夹,我的:G:\gosrc
打开vscode,选择我们的文件夹,然后新建一个文件夹叫mypro1
,里面新建一个源文件mypro1.go
。(说明:一般这个包的入口文件,和包名相同或者是main.go
)。
编写一个helloworld
package main
func init(){
println("init 1")
}
func init(){
println("init 2")
}
func init(){
println("init 3")
}
func main(){
println("hello world")
}
选中mypro1文件夹,右键 在终端打开。
在源码目录下执行命令行:
go run 源文件,直接将源码当做可执行文件执行。
go build 编译成可执行文件,然后手动执行可执行文件
实例2:多个本地包的管理
在mypro1内新建两个依赖包,分别叫helloworld和hellojohn;新建一个可执行文件包,叫myrun的目录。
进入mypro1,使用go mod创建模块
go mod init mypro1
在mypro1内自动生成了一个文件go.mod:
module mypro1
go 1.13
helloworld文件夹新建一个helloworld.go
hellojohn文件夹新建一个hellojohn.go
myrun文件夹新建一个main.go
代码内容如下
helloworld.go
package helloworld
func HelloWorld(){
println("in HelloWorld")
}
hellojohn.go
package hellojohn
func HelloJohn(){
println("in HelloJohn")
}
main.go
package main
import(
"mypro1/hellojohn"
"mypro1/helloworld"
)
func main(){
hellojohn.HelloJohn()
helloworld.HelloWorld()
}
运行源码:go run main.go
实例3:引用第三方包
这里以go-gin为例,这是一个web框架,文档有最简单的代码:
https://github.com/gin-gonic/gin
我们把上面代码的main.go替换成下面的代码,helloworld和hellojohn可以删掉。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
再执行:go run main.go
会发现下载了一些依赖,然后源码多了go.sum文件。go.sum 是记录所依赖的项目的版本的锁定。
截图中log最后提示http在8080监听。我们去浏览器打开127.0.0.1:8080/ping
其实第三方依赖被放在了GOPATH内的pkg\mod下。
我们可以使用vendor让依赖直接保存在源码路径中。
go mod vendor
go mod download
go run main.go