-
Notifications
You must be signed in to change notification settings - Fork 148
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
8a0bef6
commit 1ea59a7
Showing
5 changed files
with
12 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
# 1.4 Go2诞生 | ||
|
||
在2018年官方已经发布了Go2的设计草案,其中包含了令人惊喜的范型和错误等诸多改进,在后Go1时代过去之后将是新兴的Go2时代。需要说明的是,Go2的诞生并不表示Go1被抛弃!如何避免Py3k的笑话正是Go2第一要考虑的问题,因此才会有Go1.11到Go2逐步过段的阶段。而Go语言官方也已经通过博文承诺Go2将保持对Go1软件资产的最大兼容,鉴于Go1诺言被忠实地执行的参考,我们有理由相信Go2会处理好Go1资产的兼容性问题。 | ||
在2018年官方已经发布了Go2的设计草案,其中包含了令人惊喜的泛型和错误等诸多改进,在后Go1时代过去之后将是新兴的Go2时代。需要说明的是,Go2的诞生并不表示Go1被抛弃!如何避免Py3k的笑话正是Go2第一要考虑的问题,因此才会有Go1.11到Go2逐步过段的阶段。而Go语言官方也已经通过博文承诺Go2将保持对Go1软件资产的最大兼容,鉴于Go1诺言被忠实地执行的参考,我们有理由相信Go2会处理好Go1资产的兼容性问题。 | ||
|
||
大约在2012年前后,作者曾乐观估计Go2将在2020年前后到来,并可能带来大家期盼已久的范型特性。作者在此预测Go2将在2020年正式进入开发流程,并在2022年前后进入工业生产环境使用,而Go1将在2030年前后逐渐退出历史。为了在Go2正式到来时轻装上阵,我们需要提前把握Go语言的发展动向,而本书正是为此目标准备。 | ||
大约在2012年前后,作者曾乐观估计Go2将在2020年前后到来,并可能带来大家期盼已久的泛型特性。作者在此预测Go2将在2020年正式进入开发流程,并在2022年前后进入工业生产环境使用,而Go1将在2030年前后逐渐退出历史。为了在Go2正式到来时轻装上阵,我们需要提前把握Go语言的发展动向,而本书正是为此目标准备。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -43,16 +43,16 @@ include $(GOROOT)/src/Make.pkg | |
|
||
## 2.1.3 `GOPATH`特性的扩展 | ||
|
||
扩展`GOPATH`的目标都是为了更方便管理包。Go语言的包有三种类型:首先是叶子包,此类包最多依赖标准库,不依赖第三方包;首先是`main`包表示一个应用,它不能被其它包导入(单元测试除外);最后是普通的依赖第三方包的非`main`包。比较特殊的`main`包同时也是一个叶子包。 | ||
扩展`GOPATH`的目标都是为了更方便管理包。Go语言的包有三种类型:首先是叶子包,此类包最多依赖标准库,不依赖第三方包;其次是`main`包表示一个应用,它不能被其它包导入(单元测试除外);最后是普通的依赖第三方包的非`main`包。比较特殊的`main`包同时也是一个叶子包。 | ||
|
||
叶子包自身很少会遇到版本管理问题,因为不会遇到因为依赖第三方包产生的各种问题,因此叶子包的开发者很少关注版本管理的问题。稍微复杂一点的是`main`包,`main`包是包依赖中的根包。`main`包不担心被其它包依赖,因此它其实是可以通过一个独占的`GOPATH`来维护所有依赖的第三方包的。最复杂的是既不是`main`包,也不是叶子包的普通,因为普通包需要管理其依赖的第三方包,同时一般又不能单独管理`GOAPTH`。在vendor出现之前的版本管理实践中,普通包的版本比较简陋,很多普通包甚至都没有版本管理,只有`master`一个最新版本。 | ||
叶子包自身很少会遇到版本管理问题,因为不会遇到因为依赖第三方包产生的各种问题,因此叶子包的开发者很少关注版本管理的问题。稍微复杂一点的是`main`包,`main`包是包依赖中的根包。`main`包不担心被其它包依赖,因此它其实是可以通过一个独占的`GOPATH`来维护所有依赖的第三方包的。最复杂的是既不是`main`包,也不是普通的叶子包,因为普通包需要管理其依赖的第三方包,同时一般又不能单独管理`GOAPTH`。在vendor出现之前的版本管理实践中,普通包的版本比较简陋,很多普通包甚至都没有版本管理,只有`master`一个最新版本。 | ||
|
||
`GOPATH`的扩展主要分为横向和纵向两个方向。横向就是同时并列维护多个GOPATH目录,通过手工方式调整其中某些目录来实现目录中包版本切换的目的。纵向扩展一般在管理main包对应的应用程序中使用,通过在包内部创建临时的GOPATH子目录,在GOPATH子目录中包含全部第三方依赖的拷贝来实现外部依赖包版本的管理。 | ||
`GOPATH`的扩展主要分为横向和纵向两个方向。横向就是同时并列维护多个`GOPATH`目录,通过手工方式调整其中某些目录来实现目录中包版本切换的目的。纵向扩展一般在管理`main`包对应的应用程序中使用,通过在包内部创建临时的`GOPATH`子目录,在`GOPATH`子目录中包含全部第三方依赖的拷贝来实现外部依赖包版本的管理。 | ||
|
||
社区中早期出现的Godeps工具就是通过在当前目录下创建`Godeps/_workspace`子目录来管理维护依赖的第三方包的版本。Godeps的实践成果最终被吸收到来Go语言中,通过vendor机制实现来main包的依赖管理(不是版本管理)。但是最终vendor机制也带来来各种问题(稍后的章节会讨论),最终官方完全重新设计了模块化的特性。 | ||
社区中早期出现的Godeps工具就是通过在当前目录下创建`Godeps/_workspace`子目录来管理维护依赖的第三方包的版本。Godeps的实践成果最终被吸收到来Go语言中,通过vendor机制实现来`main`包的依赖管理(不是版本管理)。但是最终vendor机制也带来了各种问题(稍后的章节会讨论),最终官方完全重新设计了模块化的特性。 | ||
|
||
## 2.1.4 模块化之后的包目录路径 | ||
|
||
通过vendor机制来实现版本管理的尝试虽然失败了,但是通过横向扩展`GOPATH`的来维护同一个包的不同版本的思路却在模块中复活了。模块化通过重新组织目录结构,实现了同时管理同一个包的不同版本需求。 | ||
|
||
比如之前`$(GOPATH)/src/github.com/chai2010/pbgo`包的`1.0.0`版本,在模块化之后将对应`$(HOME)/go/pkg/mod/github.com/chai2010/[email protected]`。模块化通过`$(HOME)/go/pkg/mod`目录管理第三方的依赖包,同时通过`[email protected]`的版本后缀来区分同一个包的不同版本。这其实和多个GOPATH并列存放的思路是类似,不过模块化对多版本支持的更加完美。 | ||
比如之前`$(GOPATH)/src/github.com/chai2010/pbgo`包的`1.0.0`版本,在模块化之后将对应`$(HOME)/go/pkg/mod/github.com/chai2010/[email protected]`。模块化通过`$(HOME)/go/pkg/mod`目录管理第三方的依赖包,同时通过`[email protected]`的版本后缀来区分同一个包的不同版本。这其实和多个`GOPATH`并列存放的思路是类似,不过模块化对多版本支持的更加完美。 |