【Go命令教程】10. go fix 与 go tool fix
命令 go fix 会把指定 代码包 的所有 Go 语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即 Go 语言的版本。代码包的所有 Go 语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。
这个工具其实非常有用。在编程语言的升级和演进的过程中,难免会对过时的和不够优秀的语法及标准库进行改进。这样的改进对于编程语言的向后兼容性是个挑战。我们在前面提到过向后兼容这个词。简单来说,向后兼容性就是指新版本的编程语言程序能够正确识别和解析用该编程语言的旧版本编写的程序和软件,以及在新版本的编程语言的运行时环境中能够运行用该编程语言的旧版本编写的程序和软件。对于Go语言来说,语法的改变和标准库的变更都会使得用旧版本编写的程序无法在新版本环境中编译通过。这就等于破坏了Go语言的向后兼容性。对于一个编程语言、程序库或基础软件来说,向后兼容性是非常重要的。但有时候为了让软件更加优秀,软件的开发者或维护者不得不在向后兼容性上做出一些妥协。这是一个在多方利益之间进行权衡的结果。本小节所讲述的工具正是 Go 语言的创造者们为了不让这种妥协给语言使用者带来困扰和额外的工作量而编写的自动化修正工具。这也充分体现了 Go 语言的软件工程哲学。下面让我们来详细了解它们的使用方法和内部机理。
命令 go fix 其实是命令 go tool fix 的简单封装。这甚至比 go fmt 命令对 gofmt 命令的封装更简单。像其它的 Go 命令一样,go fix 命令会先对作为参数的 代码包导入路径 进行验证,以确保它是正确有效的。像在本小节开始处描述的那样,go fix 命令会把有效代码包中的所有 Go 语言源码文件作为多个参数传递给 go tool fix 命令。实际上,go fix 命令本身不接受任何标记,它会把加入的所有标记都原样传递给 go tool fix 命令。go tool fix 命令可接受的标记如下表。
表0-15 go tool fix 命令的标记说明
标记名称 | 标记描述 |
---|---|
-diff | 不将修正后的内容写入文件,而只打印修正前后的内容的对比信息到标准输出。 |
-r | 只对目标源码文件做有限的修正操作。该标记的值即为允许的修正操作的名称。多个名称之间用英文半角逗号分隔。 |
-force | 使用此标记后,即使源码文件中的代码已经与 Go 语言的最新版本相匹配了,也会强行执行指定的修正操作。该标记的值就是需要强行执行的修正操作的名称,多个名称之间用英文半角逗号分隔。 |
在默认情况下,```go tool fix``` 命令程序会在目标源码文件上执行所有的修正操作。多个修正操作的执行会按照每个修正操作中标示的操作建立日期以从早到晚的顺序进行。我们可以通过执行```go tool fix -?```来查看```go tool fix```命令的使用说明以及当前支持的修正操作。 与本书对应的Go语言版本的```go tool fix```命令目前只支持两个修正操作。一个是与标准库代码包```go/printer```中的结构体类型```Config```的初始化代码相关的修正操作,另一个是与标准库代码包``net```中的结构体类型```IPAddr```、```UDPAddr```和```TCPAddr```的初始化代码相关的修正操作。从修正操作的数量来看,自第一个正式版发布以来,Go语言的向后兼容性还是很好的。从 Go 语言官网上的说明也可以获知,在 Go 语言的第二个大版本(Go 2.x)出现之前,它会一直良好的向后兼容性。 值得一提的是,上述的修正操作都是依靠 Go 语言的标准库代码包```go```及其子包中提供的功能来完成的。实际上,```go tool fix```命令程序在执行修正操作之前,需要先将目标源码文件中的内容解析为一个抽象语法树实例。这一功能其实就是由代码包```go/parser```提供的。而在这个抽象语法树实例中的各个元素的结构体类型的定义以及检测、访问和修改它们的方法则由代码包```go/ast```提供。有兴趣的读者可以阅读这些代码包中的代码。这对于深入理解 Go 语言对代码的静态处理过程是非常有好处的。 回到正题。与```gofmt```命令相同,```go tool fix```命令也有交互模式。我们同样可以通过执行不带任何参数的命令来进入到这个模式。但是与```gofmt```命令不同的是,我们在```go tool fix```命令的交互模式中输入的代码必须是完整的,即必须要符合 Go 语言源码文件的代码组织形式。当我们输入了不完整的代码片段时,命令程序将显示错误提示信息并退出。示例如下:
hc@ubt:~$ go tool fix -r='netipv6zone' a := &net.TCPAddr{ip4, 8080} standard input:1:1: expected 'package', found 'IDENT' a
相对于上面的示例,我们必须要这样输入源码才能获得正常的结果:
hc@ubt:~$ go tool fix -r='netipv6zone' package main import ( "fmt" "net" ) func main() {
addr := net.TCPAddr{"127.0.0.1", 8080}
fmt.Printf("TCP Addr: %s\n", addr)
} standard input: fixed netipv6zone package main import ( "fmt" "net" ) func main() {
addr := net.TCPAddr{IP: "127.0.0.1", Port: 8080}
fmt.Printf("TCP Addr: %s\n", addr)
}
上述示例的输出结果中有这样一行提示信息:“standard input: fixed netipv6zone”。其中,“standard input”表明源码是从标准输入而不是源码文件中获取的,而“fixed netipv6zone”则表示名为netipv6zone 的修正操作发现输入的源码中有需要修正的地方,并且已经修正完毕。另外,我们还可以看到,输出结果中的代码已经经过了格式化。
摘自:
http://wiki.jikexueyuan.com/project/go-command-tutorial/0.10.html
【Go命令教程】10. go fix 与 go tool fix的更多相关文章
- 【Go命令教程】命令汇总
[Go命令教程]1. 标准命令详解 [Go命令教程]2. go build [Go命令教程]3. go install [Go命令教程]4. go get [Go命令教程]5. go clean [G ...
- 【译】ASP.NET MVC 5 教程 - 10:添加验证
原文:[译]ASP.NET MVC 5 教程 - 10:添加验证 在本节中,我们将为Movie模型添加验证逻辑,并确认验证规则在用户试图使用程序创建和编辑电影时有效. DRY 原则 ASP.NET M ...
- 痞子衡嵌入式:第一本Git命令教程(0)- 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家讲的是Git命令汇编,共12篇文章,循序渐进地介绍Git操作的完整过程. 在开始Git课程之前,需要先跟大家普及2个重要概念(四度空间.四种状 ...
- 天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
问题重述: 当我们使用天河机进行并行程序实验的时候,都会使用到yhrun/srun命令.在超算环境下,yhrun 命令用来进行提交交互式作业,有屏幕输出.但是容易受到网络波动影响导致断网或者关闭窗口最 ...
- Windows 批处理(cmd/bat)常用命令教程
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 解决方法在文章末尾! ...
- [译]Vulkan教程(10)交换链
[译]Vulkan教程(10)交换链 Vulkan does not have the concept of a "default framebuffer", hence it r ...
- node-webkit教程(10)Platform Service之File dialogs
node-webkit教程(10)Platform Service之File dialogs 文/玄魂 目录 node-webkit教程(10)Platform Service之File dialog ...
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- Linux pwn入门教程(10)——针对函数重定位流程的几种攻击
作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...
随机推荐
- tensorflow随机张量创建
TensorFlow 有几个操作用来创建不同分布的随机张量.注意随机操作是有状态的,并在每次评估时创建新的随机值. 下面是一些相关的函数的介绍: tf.random_normal 从正态分布中输出随机 ...
- python中的__iter__ __reversed__ __next__
__reversed__ 返回集合的倒叙迭代器,如果没有实现这个方法,reversed()会去使用__getitem__和__len__来实现 介绍__next__和 __iter__方法需要了解下可 ...
- python 搭建http服务器和ftp服务器
默认安装版本为pytho2.7 http服务器搭建: 进入要开放访问的目录下,执行命令:python -m SimpleHTTPServer 9000 显示上述表示安装成功,且http服务的端口为:9 ...
- 中文分词-jieba
支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义: 搜索引擎模式,在精确模式的基础上,对长词再次切分 ...
- tensorflow-训练(train)/测试(test)
一个TFRecords 文件为一个字符串序列.这种格式并非随机获取,它比较适合大规模的数据流,而不太适合需要快速分区或其他非序列获取方式. 操作组 操作 Training Optimizers,Gra ...
- 事务ACID特性
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行. 数据库事务必须具备 ...
- 【LOJ】#2527. 「HAOI2018」染色
题解 简单容斥题 至少选了\(k\)个颜色恰好出现\(S\)次方案数是 \(F[k] = \binom{M}{k} \frac{N!}{(S!)^{k}(N - i * S)!}(M - k)^{N ...
- 开始使用KVM和QEMU
一. 简介 Quick Emulator(QEMU) 是QEMU/KVM虚拟化套件中的主要组成部分. 它提供了硬件的虚拟化和处理器的仿真. QEMU不用运行在内核,它是运行在用户空间的. QEMU支持 ...
- cos,sina,tan,cot
这些都是三角形的公式. 三角形总之就是一个直角两个锐角. cos就是余弦定理,就是锐角的邻边除以三角形的斜边. sin就是正弦定理,就是锐角的对边除以三角形的斜边. tan就是正切定理,就是锐角的对边 ...
- Wireshark网络分析就这么简单
tcpdump抓包命令: root#tcpdump -I eth0 -s 80 -w /tmp/tcpdump.cap 注:其中80表示,只抓每个包的前80个字节. 抓包时就筛选自己需要的包: Wir ...