11.1、package

package pacakgeName

Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称,虽然Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。

11.1.1、包的基本使用

导入包的语法:

import "包的路径"    // 双引号

(1)内部模块导入

导入包路径规则:

GOROOT/srcGOPATH/srcfmtGOROOT/src

目录结构

├─mysite
        ├─api
        │      http.go
        │      rpc.go
        │
        └─main
                main.go

// http.go
package api

import "fmt"

func HttpRequest(){
	fmt.Println("HttpRequest方法")
}

// rpc.go
package api

import "fmt"

func RpcRequest(){
	fmt.Println("RpcRequest方法")
}


// main.go
package main

import "fmt"   //标准库包
import "mysite/api"


func main() {

	fmt.Println("hi,yuan!")
	api.HttpRequest()
	api.RpcRequest()
}


-package apipackage newApi
import "mysite/api" // 注意文件夹api的名字不改动,这里导入的就是文件夹名
func main() {
	newApi.HttpRequest()  // 使用的package的名字
	newApi.RpcRequest()
}
GO111MODULE=offmysitesrc

(2)外部模块导入

当需要一个外部包时需要下载到本地,命令是

go get "远程包"
$GOPATH/src

比如

package main

import (
	"fmt"
	"mysite/api"   // 内部包导入
)
import "github.com/jinzhu/now"   // 外部包导入      


func main() {
    
    
	api.HttpRequest()
	api.RpcRequest()
    
	fmt.Println(now.BeginningOfMinute())

}

远程包介绍:



go get "github.com/jinzhu/now"

git-clone拉取下载存放在gopath/src目录:



import "github.com/jinzhu/now"

11.1.2、包的导入格式

// 一次导入多个包
import (
	"fmt"
	"mysite/api"
)

// 设置包的别名
import F "fmt"

// 省略引用格式
import . "mysite/api"
HttpRequest()

// 匿名导入 :在引用某个包时,如果只是希望执行包初始化的 init 函数,而不使用包内部的数据时,可以使用匿名引用格式
import _ "包名"
import (
      "database/sql"
      _ "github.com/go-sql-driver/mysql"
  )  

11.1.3、包的加载顺序

init()
init()init()



11.2、go module

module是一个相关Go包的集合,它是源代码更替和版本控制的单元。

11.2.1、Go mod命令

/*
download    download modules to local cache (下载依赖的module到本地cache))
edit        edit go.mod from tools or scripts (编辑go.mod文件)
graph       print module requirement graph (打印模块依赖图))
init        initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件))
tidy        add missing and remove unused modules (增加丢失的module,去掉未用的module)
vendor      make vendored copy of dependencies (将依赖复制到vendor下)
verify      verify dependencies have expected content (校验依赖)
why         explain why packages or modules are needed (解释为什么需要依赖)*/
$GOPATH/pkg$GOPATH/pkg/mod

11.2.2、go mod流程

mysitesrc
set GO111MODULE=ongo mod initgo.modgo.mod
go mod init xxx  // xxx即声明的模块名
go.mod
module xxx

go 1.16
requirements
go mod tidy
go.sum-vgo mod tidy -v
GOPATH/pkg/mod
go mod verifyall modules verifiedgo mod vendorgo.modmodules.txtgo mod vendor -v



go.modapiimport "xxx/api"