Uber在公司内部开源《Go 语言风格指南》按照Uber的说法,《Go 语言风格指南》是管理Uber代码的约定,这些约定不仅涵盖了源文件格式,而是由gofmt处理。(gofmt工具可以帮助开发者将他们的代码格式化成统一的风格。)本指南详细介绍了Uber在编写Go代码时的注意事项,使代码库更易于管理,帮助开发者更好地使用它。Go的语言特性本指南最初由PrashantVaranasi和SimonNewton编写,目的是让一些同事加快使用Go的速度。多年来,它根据其他人的反馈进行了多次修改。其中许多约定是Go的通用指南,而其他约定则参考外部来源:EffectiveGoGo常见错误指南使用运行golint和govet没有错误的代码。建议编辑器设置为:保存时运行goimports运行golint并检查错误指针。一个接口是两个字段:1.指向特定类型信息的指针。您可以将其视为“类型”。2、数据指针,如果存放的数据是指针,直接存放。如果数据存储一个值,则存储指向该值的指针。如果要接口方法修改底层数据,就必须使用指针。接收者和接口方法可以从指针和值中调用具有值接收者的方法。例如:typeSstruct{datastring}func(sS)Read()string{returns.data}func(s*S)Write(strstring){s.data=str}sVals:=map[int]S{1:{"A"}}//YoucanonlycallReadusingavaluesVals[1].Read()//Thiswillnotcompile://sVals[1].Write("test")sPtrs:=map[int]*S{1:{"A"}}//YoucancallbothReadandWriteusingapointersPtrs[1].Read()sPtrs[1].Write("test")此外,即使该方法具有值接收器,也可以通过指针来满足接口。typeFinterface{f()}typeS1struct{}func(sS1)f(){}typeS2struct{}func(s*S2)f(){}s1Val:=S1{}s1Ptr:=&S1{}s2Val:=S2{}s2Ptr:=&S2{}variFi=s1Vali=s1Ptri=s2Ptr//下面不编译,因为2Valisavalue,没有valuereceiverforf。EffectiveGo对Pointersvs.Values有很好的分析。目前该指南在Github上有2.9K星数和246个Forks(Github地址:https://github.com/uber-go/guide/blob/master/style.md)
