Go 在 1972 年提交了第一行代码?
Posted 脑子进煎鱼了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 在 1972 年提交了第一行代码?相关的知识,希望对你有一定的参考价值。
大家好,我是煎鱼。
关于 Go 语言的宣发,大家都知道最早是在 2007 年进行设计,于 2009 年问世,2012 年发布 1.0 版本。
Wikipedia 上的历史如下图:
但对于 Go 本身来讲,第一行为大家所知的代码又是何时提交的呢?
开源库能够找到一些端倪,如下 git commit 记录:commit 7d7c6a97f815e9279d08cfaea7d5efb5e90695a8
Author: Brian Kernighan <bwk>
Date: Tue Jul 18 19:05:45 1972 -0500
hello, world
R=ken
DELTA=7 (7 added, 0 deleted, 0 changed)
diff --git a/src/pkg/debug/macho/testdata/hello.b b/src/pkg/debug/macho/testdata/hello.b
new file mode 100644
index 0000000000..05c4140424
--- /dev/null
+++ b/src/pkg/debug/macho/testdata/hello.b
@@ -0,0 +1,7 @@
+main( )
+ extrn a, b, c;
+ putchar(a); putchar(b); putchar(c); putchar(\'!*n\');
+
+a \'hell\';
+b \'o, w\';
+c \'orld\';
通过上述记录,我看到第一个提交来自 1972 年 07 月 18 日(不得不说我还没有出生)。由传奇人物 Brian Kernighan 所提交,他又是谁?
Brian Kernighan 是谁Brian Kernighan 是贝尔实验室的成员之一,曾参加 Unix 系统的早期开发和 Plan9 的研发,是一个非常优秀的大佬。
如下图:
看起来 Brian 与 Go 还是有千丝万缕的关系的,又是 Plan9、Go 等底层和图书的输出,但似乎与广大了解的不一样。
他为什么会出现在第一次提交?
为什么会出现由于这个问题已经被问烦了,Russ Cox 写了一篇《Go’s Version Control History[2]》文章做一个 Go 提交历史的梳理。
实际上前面看到的提交,对于 Go 来讲是 “假提交”,真正的第一次 Go 提交是:
commit 18c5b488a3b2e218c0e0cf2a7d4820d9da93a554
Author: Robert Griesemer <gri@golang.org>
AuthorDate: Sun Mar 2 20:47:34 2008 -0800
Commit: Robert Griesemer <gri@golang.org>
CommitDate: Sun Mar 2 20:47:34 2008 -0800
Go spec starting point.
SVN=111041
doc/go_spec | 1197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1197 insertions(+)
是先定的 The Go Annotated Specification(Go 注释规范),里面包含:最近的设计决策、指导原则等大量语言细节,基本拟定了现在 Go 的样子。
先前 Brian Kernighan 的第一次 “hello world”提交,实际上是 Russ Cox 在 2009 年 10 月左右,为了准备 Go 开源,将 SVN 转到 Perforce,再转到 Mercurial 时所引入的(以上 3 个均为版本管理工具)。
也就是这个提交是人为引入的,复制自 Brian Kernighan 的 《A Tutorial Introduction to the Language B》:
main( )
extrn a, b, c;
putchar(a); putchar(b); putchar(c); putchar(’!*n’);
a ’hell’;
b ’o, w’;
c ’orld’;
除了本文中提到的 1972 年的提交,还又引入了 1974 年、1988 年的各种代码。
我想是为了致敬各位大佬,可以理解为一种程序员式的浪漫了。
总结在这几十年,Go 从 SVN,再到 Perforce,到 Google Code Mercurial 又到 Gerrit Code Review,经历了多次变更,这是现在的结局和选择。
但熟悉 Go 的同学都知道,其实 Gerrit 也有许多可以提高的地方,未来相信我们会看到第 6 次变更。
而以往的假提交,更多的是为了致敬大佬,是一种程序员浪漫了:)
参考资料golang/go: https://github.com/golang/go
[2]Go’s Version Control History: https://research.swtch.com/govcs
关注煎鱼,获取业内第一手消息和知识 Go 语言编程规范
1. gofmt 命令
大部分的格式问题可以通过 gofmt 来解决,gofmt 自动格式化代码,保证所有的 go 代码与官方推荐的格式保持一致,所有格式有关问题,都以gofmt的结果为准。所以,建议在提交代码库之前先运行一下这个命令。
2. 行长
一行最长不超过80个字符,超过的使用换行展示,尽量保持格式优雅。
3. 注释
在编码阶段应该同步写好 变量、函数、包 的注释,最后可以利用 godoc 命令导出文档。注释必须是完整的句子,句子的结尾应该用句号作为结尾(英文句号)。注释推荐用英文,可以在写代码过程中锻炼英文的阅读和书写能力。而且用英文不会出现各种编码的问题。
每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释。包如果有多个 go 文件,只需要出现在一个 go 文件中即可。
// ping包实现了常用的ping相关的函数 package ping
4. 命名
- 需要注释来补充的命名就不算是好命名。
- 使用可搜索的名称:单字母名称和数字常量很难从一大堆文字中搜索出来。单字母名称仅适用于短方法中的本地变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称。
- 做有意义的区分:Product 和 ProductInfo 和 ProductData 没有区别,NameString 和 Name 没有区别,要区分名称,就要以读者能鉴别不同之处的方式来区分 。
- 函数命名规则:驼峰式命名,名字可以长但是得把功能,必要的参数描述清楚,函数名应当是动词或动词短语,如 postPayment、deletePage、save。并依 Javabean 标准加上 get、set、is前缀。例如:xxx + With + 需要的参数名 + And + 需要的参数名 + …..
- 结构体命名规则:结构体名应该是名词或名词短语,如 Custome、WikiPage、Account、AddressParser,避免使用 Manager、Processor、Data、Info、这样的类名,类名不应当是动词。
- 包名命名规则:包名应该为小写单词,不要使用下划线或者混合大小写。
- 接口命名规则:单个函数的接口名以”er”作为后缀,如 Reader,Writer。接口的实现则去掉“er”。
type Reader interface { Read(p []byte) (n int, err error) } // 多个函数接口 type WriteFlusher interface { Write([]byte) (int, error) Flush() error }
5. 常量
常量均需使用全部大写字母组成,并使用下划线分词:
const APP_VER = "1.0"
如果是枚举类型的常量,需要先创建相应类型:
type Scheme string const ( HTTP Scheme = "http" HTTPS Scheme = "https"
)
6. 变量
变量命名基本上遵循相应的英文表达或简写,在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母,例如:
- user 可以简写为 u
- userID 可以简写 uid
- 若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头:
var isExist bool var hasConflict bool var canManage bool var allowGitHook bool
7. 变量命名惯例
变量名称一般遵循驼峰法,但遇到特有名词时,需要遵循以下规则:
- 如果变量为私有,且特有名词为首个单词,则使用小写,如:apiClient
- 其它情况都应当使用该名词原有的写法,如 APIClient、repoID、UserID
- 错误示例:UrlArray,应该写成 urlArray 或者 URLArray
下面列举了一些常见的特有名词:
"API","ASCII","CPU","CSS","DNS","EOF",GUID","HTML","HTTP","HTTPS","ID","IP","JSON","LHS","QPS","RAM","RHS" "RPC", "SLA","SMTP","SSH","TLS","TTL","UI","UID","UUID","URI","URL", "UTF8","VM","XML","XSRF","XSS"
8. struct规范
struct申明和初始化格式采用多行,定义如下:
type User struct{ Username string Email string }
初始化如下:
u := User{ Username: "test", Email: "[email protected]", }
9. panic
尽量不要使用panic,除非你知道你在做什么
10. import
对 import 的包进行分组管理,用换行符分割,而且标准库作为分组的第一组。如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包
package main import ( "fmt" "os" "kmg/a" "kmg/b" "code.google.com/a" "github.com/b" )
goimports 会自动帮你格式化
11. 参数传递
- 对于少量数据,不要传递指针
- 对于大量数据的 struct 可以考虑使用指针
- 传入的参数是 map,slice,chan 不要传递指针,因为 map,slice,chan 是引用类型,不需要传递指针的指针
12. 单元测试
单元测试文件名命名规范:
example_test.go
测试用例的函数名称必须以 Test 开头,例如:
func TestExample
以上是关于Go 在 1972 年提交了第一行代码?的主要内容,如果未能解决你的问题,请参考以下文章