4-Go语言基础-包管理

前言

了解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

发布了264 篇原创文章 · 获赞 23 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Edu_enth/article/details/103990707