golang--学习day05

文章介绍了Go语言中的vendor机制,包括其作用、使用方法以及优缺点。然后过渡到GOMODULES,作为Go1.11引入的模块化解决方案,它解决了依赖包的版本控制问题,并逐渐取代了GOPATH模式和vendor。GOMODULES通过go.mod文件管理依赖,使得代码移植和版本控制更加精确。

Vendor 机制

1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。

govendor是一个基于vendor机制实现的Go包依赖管理命令行工具
使用广发且具有代表性的主要有下面几个:

  • godep
  • glide
  • govendor

SDK 1.5 发布 1.5 版本时,就说可以使用自身提供的 vendor 特性,但是需要设置如下环境变量:go15 VENDOREXPERIMENT=1
发布 1.6 版本时,该环境变量的值已经默认设置为 1 了,该值可以使用 go env 命令查看。
发布 1.7 版本时,将去掉该环境变量,默认开启vendor 特性。
1.9 版本推出了实验性质的包管理工具 dep
1.11 版本推出 modules 机制,简称 mod。modules 的原型其实是 vgo,关于vgo,可以自行搜索。

使用条件

vendor机制是处于GOPATH体系中,只有在GOPATH/src下,vendor才有意义才起作用

注意:vendor仍然需要GHPATH设定下来实现的,但是慢慢脱离了GOPATH/src的依赖查找

improt优先查找

  • 当前GOPATH/项目根/vendor目录
  • GOROOT/src
  • GOPATH/src

govendor 使用安装

go get -u github.com/kardianos/govendor

可执行文件govendor.exe安装在$GOROOT/bin

govendor 命令

  • init 创建 vendor 目录和 vendorjson 文件
  • list 列出过滤依赖包及其状态
  • add 从 $GOPATH 复制包到项目 vendor 目录A
  • update从 $GOPATH 更新依赖包到项目 vendor 目录
  • remove 从 vendor 目录移除依赖的包

vendor 优点

将依赖的外部包引进工程下的vendor目录,可以直接在其他机器直接编译,而不用再去构建外部包的编译环境,一个一个的 go get 获取外部依赖包。
防止了go get 重新拉取的外部包的版本可能和期望的不一致,从而导致编译错误问题。

vendor缺点

无法精确的引用外部包进行版本控制,不能指定引用某个特定版本的外部包。只是在开发时将其拷贝过来,但是一旦外部包升级,vendor下的代码不会跟着升级。

以上只对vendor做简单了解,我们主要还是试用GO MODULES

GOMODULES模块化初识

vendor: 包共享模式 =>单独工程独立维护模式(单独工程vendor目录 vendor.json)

GOPATH 工作区: 包共享模式 ( 共享 GOPATH/src 依赖包、GOROOT /src 内置包)

vendor 保证了工程目录下代码的完整性,将工程代码 复制到 其他 Go 编译环境,不需要再去 go get 拉取下载第三方依赖包。让项目代码直接就能 go install / go build 编译。

保证了工程目录下代码的完整性

依赖包和代码包都是放在同一个工程目录下其中:依赖包(工程目录/vendor)

GO中包的定义与介绍

GO中包分为3种: 系统内置包(GOROOT/src) 、自定义包、第三方包(go get)

MODULE模块介绍

module 模块是一个相关Go包的集合,它是源代码更替和版本控制的单元。模块由源文件形成的go.mod文件的根目录定义,包含go.mod文件的目录也被称为模块根。

Go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于Go1.14 推荐在生产上使用。

Go modules 目前集成在 Go 的 SDK 中,只要安装了 Go,自然而然也就可以使用 Go modules 了,而Go modules 的出现也解决了在 Go1.11 前的几个常见争议问题:

  • Go语言依赖包管理问题(依赖包 版本控制问题)
  • “淘汰”GOPATH模式
  • 统一社区中的其它的依赖管理工具(提供迁移功能)

包管理工具go mod

要求 golang-SDK 最低版本是 1.11

GO15VENDOREXPERIMENT=1 1.6 默认为1 1.7 就删除了环境变量配置,默认开启 vendor

当GO111MODULE=off时,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找

当 module 功能启用时,存储下载的依赖包,具体位置在$GOPATH/pkg/mod

开启 GO111MODULE?auto 默认值

GO111MODULE 是 go 开启 mod 包管理工具的一个环境配置,共有三个配置项,分别是 off、on、auto 。开启mod包管理模式,可以使用选项 on 或auto。

go env -W GO11MODULE=auto
go env -W GO111MODULE=on

GO111MODULE=off
无模块支持,go 会从 $GOPATH 文件夹和 vendor 目录中寻找依赖项。
GO111MODULE=on

模块支持,go 忽略 $GOPATH 文件夹,只根据 go.mod 下载依赖
GO111MODULE=auto

自动(auto)的规则在 go 的 1.13 版本之后,扫描当前目录文件夹中是否存在 go,mod 文件,如果存在则启用,不存在则关闭。

go mod init生成 go.mod 文件
go mod download下载 go.mod 文件中指明的所有依赖整理现有的依赖
go mod tidy 整理现有的依赖
go mod graph 查看现有的依赖结构
go mod edit 编辑 go.mod 文件
go mod vendor导出项目所有的依赖到vendor目录
ao mod verifv校验一个模块是否被篡改过

go.mod 创建初始化
官方文档: https:/golang;gogle.cn/doc/modules/gomod-ref 官网演示
Each Go module is defined by a go.mod file that describes the module’s properties, including itsdependencies on other modules and on versions of Go.
每个 Go 模块都由一个 Go.mod 文件所定义,用来描述模块相关的属性,包括它对于其他模块和GO版本的依赖。

<think>嗯,用户想要一个从零开始的Golang语言教程。首先,我需要确定用户的基础水平,可能是一个完全没有编程经验的新手,或者有其他语言经验但想学Go的人。不管怎样,教程需要从基础开始,逐步深入。 首先,应该介绍Go的背景,比如由Google开发,强调简洁、高效和并发处理。然后,安装和环境搭建是必须的,用户需要知道如何设置Go的工作环境,包括GOPATH和GOROOT这些概念,可能还需要指导如何安装VS Code或其他编辑器。 接下来,基本语法结构。第一个程序通常是“Hello, World!”,这能帮助用户快速上手。然后介绍变量声明、数据类型、控制结构如if-else、for循环,可能还要提到Go没有while循环,而是用for实现。函数定义也是基础部分,包括多返回值的特性。 然后,进阶部分应该包括指针、结构体、方法、接口,这些是Go面向对象的核心概念。还有数组、切片、映射这些数据结构,以及错误处理机制,比如error类型和panic/recover。 并发是Go的亮点,需要详细讲解goroutine和channel,通过例子展示如何实现并发通信。包管理和模块部分,现在Go Modules已经是标准,需要解释go mod的使用,以及如何导入第三方包。 工具链部分,介绍go build、go run、go test等命令,还有测试和性能分析工具如pprof。最后,实战项目建议,比如CLI工具、Web服务,或者并发应用,帮助用户巩固知识。 用户可能还关心学习资源,比如官方文档、在线教程、书籍推荐,以及社区支持。需要确保内容结构清晰,步骤明确,避免信息过载。同时,注意示例代码的正确性和简洁性,让用户容易理解和练习。可能还需要提醒常见的陷阱和最佳实践,帮助用户避免错误。</think>以下是一份从零开始的 Go 语言Golang)基础教程大纲,适合编程新手或转语言学习者: --- ### **一、Go 语言简介** - **特点**:简洁、高效、并发支持、编译型语言 - **应用场景**:后端服务、云原生(Docker/K8s)、微服务、CLI工具 - **优势**:快速编译、垃圾回收、原生并发模型(goroutine) --- ### **二、环境搭建** 1. **安装** - 官网下载:[https://golang.org](https://go.dev/) - 验证安装:终端输入 `go version` 2. **配置环境变量** - `GOPATH`(工作目录) - `GOROOT`(Go安装路径) 3. **编辑器推荐** - VS Code(安装 Go 插件) - Goland(JetBrains 专业 IDE) --- ### **三、基础语法** #### 1. 第一个程序 ```go package main import "fmt" func main() { fmt.Println("Hello, World!") } ``` - `go run hello.go` 直接运行 #### 2. 变量与数据类型 ```go var name string = "Alice" // 显式声明 age := 25 // 类型推断(短声明) const PI = 3.14 // 常量 // 基础类型:int, float64, bool, string // 复合类型:array, slice, map, struct ``` #### 3. 控制结构 ```go // if-else if x > 10 { fmt.Println("Large") } else { fmt.Println("Small") } // for 循环(无 while) for i := 0; i < 5; i++ { ... } // switch switch day { case "Mon": fmt.Println("周一") default: fmt.Println("其他") } ``` #### 4. 函数 ```go func add(a int, b int) int { return a + b } // 多返回值 func swap(x, y string) (string, string) { return y, x } ``` --- ### **四、进阶特性** #### 1. 指针与结构体 ```go type Person struct { Name string Age int } p := Person{Name: "Bob"} p.Age = 30 ``` #### 2. 接口与错误处理 ```go type Shape interface { Area() float64 } // 错误处理 result, err := someFunction() if err != nil { log.Fatal(err) } ``` #### 3. 并发编程 ```go // goroutine(轻量级线程) go func() { fmt.Println("Running in goroutine") }() // channel 通信 ch := make(chan string) go func() { ch <- "message" }() msg := <-ch ``` --- ### **五、包管理与工具链** - **Go Modules**(依赖管理) ```bash go mod init project-name go get github.com/package-name ``` - **常用命令** - `go build`:编译 - `go test`:运行测试 - `go fmt`:格式化代码 --- ### **六、学习资源推荐** 1. **官方文档**:[https://go.dev/doc/](https://go.dev/doc/) 2. **在线教程**: - [Tour of Go](https://go.dev/tour/)(交互式学习-Go 语言圣经》(中文版) 3. **书籍**: -Go 程序设计语言-Go Web 编程》 --- ### **七、实战项目建议** 1. 编写命令行工具(如文件管理器) 2. 构建 RESTful API(使用 Gin 或 Echo 框架) 3. 实现并发网络爬虫 通过以上步骤,你可以逐步掌握 Go 语言的核心特性。建议边学边写代码,注重理解并发模型和接口设计!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值