人走茶凉|如何避免用动态语言的思维写Go代码
由于招聘市场上Go工程师的供给量不足 , 所以在招人的时候我们招了不少愿意转型用Go语言进行开发的PHP工程师 , 不过虽说换了个语言 , 在他们代码的时候还是能发现很多PHP的影子 。 if语句后面非要带括号这种问题就不说了 , 这属于不懂事 , gofmt就会强行把你掰过来 。 最大的问题还是因为以前用惯了PHP的数组 , 到写Go代码时还是不习惯先定义类型后使用这种习惯 。 还有就是以前写PHP的时候可能没养成使用异常的习惯 , 在返回值里约定特殊值来代表错误 。 所以后面我在团队内部做过一次培训 , 专门分享了怎么建立正确的Go编码习惯 , 以下是节选了当时演讲稿的一部分 。 其实不是专门针对PHP程序员 , 可能写动态语言的程序员在开始用Go写代码时都容易犯的一些错误 。
Go编程的注意事项及建议接下来我们会说几个PHP程序员在刚开始用Go写程序时几个需要改变的编码习惯和要注意的地方 。
尽量使用结构体切片代替字典【人走茶凉|如何避免用动态语言的思维写Go代码】我们有的新同学特别爱使用Go里面的Map , 有的时候还是切片里边套Map , 比如我看一开始有的同学把一些配置信息放在map[string]string类型的Map里 , 多个的话再把Map放进切片里 , 比如这样 。
var configMap = []map[string]string{ {"stockNum": "100","name":"芒果TV周卡","type":"virtual",},}
后面程序使用的时候再去用键去取值 , 这么做程序当然能实现 , 但你会发现Go里面因为是强类型 , 你在用上面字典里面的数值时还得对他们做类型转换 。 很多同学马上会说 , 那我把Map的类型换成map[string]interface{} , 我只能说你试试 , 看你用的时候Go让不让你做类型断言 。
这其实是涉及一个思维的转变 , 那么在像Go这样的强类型语言里针对这种情况该怎么办呢?这就需要让我们养成先定义结构体类型后使用的习惯了 , 比如像上面的情况我就可以先定义一个类型 。
type Product struct { StockNumint64 Namestring Typestring}var configs = []*Product { {StockNum: 100,Name: "芒果TV周卡",Type: "virtual", },......}
这么做就能避免像上面那样使用StockNum前还得把它转成整型的问题了 , 而且编辑器还能做类型提示 , 不需要你刻意记得Map里的键 , 还能避免你一时疏忽把键拼错导致BUG的尴尬 。
除了上面说的还有人喜欢在返回值里返回Map , 这种写法除了会导致上面说的那样问题 , 让别人使用起来也特别不方便 。 比如我要用你的方法我还得进去看看你的代码里这个Map到底有哪些键 。
所以我们写Go代码时 , 其实Map的使用率要比在PHP里使用数组低很多 , 很多时候都是用结构体以及结构体切片的 , 对于那种key为数据ID , 值为数据Map的这种映射 , 也是改成Key为数据ID , 值为数据自己定义的类型才对 。 比如下面这个Map类型的变量 , 它的Key是产品的ID , 值的类型是我们上面定义的Product结构体
var productMap = map[int64]*Product { 123:{StockNum: 100,Name: "芒果TV周卡",Type: "virtual", },}
针对这部分说的这个问题我觉得记住:**"根据数据先定类型再使用"**这个原则就行了 。
说完这个在代码里出现率最高的问题后 , 下面我们再说几个写Go代码时的要注意的细节 。
零值陷阱未进行初始化的变量默认值为其类型的零值 , 需要注意的是slice , map , chan和*T类型对应的零值是nil 。
这些类型的变量在未初始化前是无法在程序里直接使用的 , 有些情况下会导致运行时错误 。
常见的两种运行时错误是:
- 搜狐新闻|准大学生数码三件套如何选?这些元气好物值得种草
- 想好好做医生的胖子|五十岁女性经常有周身无力和疼痛的困扰!该如何应对?医生告诉您
- 儿童饮食|秋冬季如何让宝宝爱上吃水果?稍微蒸一下美味翻倍,营养价值更高
- 队员|北极科考中“遭遇”北极熊,看科考队员如何与它们和谐相处
- 中国历史发展过程|中国历史发展过程!中国游戏外挂发展史:“辅助工具”是如何成长为“苍
- 金色年华录|都是男扮女装谈恋爱,《少女大人》比《女世子》如何?
- 上海市嘉定区人民政府网站|每年消耗3350吨蔬菜150吨肉,嘉定这家中央厨房如何践行“光盘行动”?
- 上海嘉定|如何让《民法典》走进群众心里?嘉定这些街镇和单位这样做
- 没蜡笔的小新|“整容脸”应该被鄙视吗?医生告诉你千篇一律的好看皮囊如何而来
- 绅士老司机|多重身份加身,一人拖垮9部剧,赵立新是如何作糊的?