go 语言学习历程

hittata · · 5847 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

接触go是2012年的时候,真正开始系统的学习和开发系统是2014年了,go语言的学习也算自己2014年的重要工作之一,对go语言学习的总结,也算是年底总结之一

1.学习go的原因和动机:
            1>先前做过2年Unix c开发经验, 对于C系的语言有特殊的感情,go特别适合我胃口,用过后爱不释手;
            2>go语言团队太过耀眼和强大:Thompson 图灵奖获得者,unix 和C的共同发明人;Pike PLAN9操作系统的主要开发者、UTF-8发明者;Robert Griesemer 参与java的HotSpot, js v8引擎开发者;
          3>国内传道者的极力推荐:许式伟兄,谢孟军兄等强力推荐及相关书籍问世;

2.学习资料:
           书籍是:老许的《go语言编程》、 老谢的《go web编程》、 雨痕的《go 语言学习笔记》、 golang.org上面的《Effective Go》、《The Go Programming Language Specification》、go标准库和github上众多开源库
           
3.go 学习体会:
go 语言基础知识非常简单,简单到几天就可以学完,并能够上手开发;但是要做到精通,没有几年功力很难达到,这是学习任何一门编程语言都必须要经历的,你唯一能做的是:不停的写代码,不停的思考,不停的总结,不停的请教高手;


4.go 学习难点,将我在学习中遇到的难点,以及相关参考资料索引出来,这是件非常有价值的事情:

  • go map slice string array interface 底层数据模型,其中array 和slice是引起混乱的根源;参见:Russ Cox非常经典文章

Go Data Structures

Arrays, slices (and strings): The mechanics of 'append'

  • go defer panic recover 是go特有的,比较新,需习惯使用;

使用Defer的几个场景

  • go interface 接口的底层实现机制(能深入到源码)(深入才能理解:接口赋值,接口转换,接口断言及go的动态性);对于go语言来说接口是灵魂;

参见:老许《Go语言编程》 第9章 9.5节 接口机理

参加:国外一位大佬写的:How to use interfaces in Go

参见:interfaces_and_types

参见:Learning Go - Interfaces & Reflections

  • go 类型系统:这个对掌握一个语言非常重要:static type(语言层面就是静态类型语言), dynamic type(动态类型针对接口而言) ,underly type(底层类型针对强制转换和赋值);

参见:The Go Programming Language Specification-type

参见:Learning Go - Types

  • go function :多值返回,带命名的返回参数用法;闭包;函数是一等公民;函数也是一种基础类型,可以type xxx func 为函数新定义一种类型;

参见国外大牛:Function Types in Go (golang)


  • go 参数传递:函数参数全部是传值:即使传递的是指针,传递的也是指针的拷贝;闭包引用变量是引用;
所谓引用是指使用的不是指针,但是却有指针的作用,引用:a做为参数传递函数内部,函数内部修改a却改变了外部a的值

指针:*a作为参数传递到函数内部,函数内部修改了*a的值被改变;

参见:Go语言的传参和传引用  这篇文章分析的非常到位时难得好文章

  • go error 处理机制,error 与nil 关系,参见
Go中error类型的nil值和nil

  • go package、全局const(常量)、var(变量)加载顺序,及package引用机制:
参见:老许《Go语言编程》

  • go reflect :反射是一个强大的武器,是一个新手成为老手的必须涉猎的东西

参见:官方版 laws-of-reflection

翻译版的:The-laws-of-reflection  我认为这是翻译的最好的一篇文章,融入了作者的思考和感悟

还有我的简写版的,更多的是个API的指引:The laws of reflection

martini 框架使用的经典DI库:inject  教科书版的学习代码

  • go channel和gorutone实现原理;使用方法;并发编程模式;

参见《go并发编程》

参见goroutine背后的系统知识

  • go gc:了解下go内存管理,GC实现原理go 调试与性能分析,GDB调试技术

参见雨痕学习笔记

 

5.框架学习:

  学习了谢大的beego框架,beego非常容易入门,模块化设计,并且模块非常齐全;谢大人比较热情,QQ群较活跃,,我的两个小系统都是基于beego开发的;小黑的这篇导读对于想看框架源码的人来说是个福音;

Martini 只是看了inject那部分,2015年希望有时间细看一下 martini 和 revel。


6.期待

   期待有个牛人能出一本专门介绍 go 如何设计大系统的书,go语言设计模式和面向对象设计模式有很大差别;老许有一篇PPT里面介绍go的面向连接和组合的语言,以七牛系统的规模,应该可以抽象出一套模式出来,有人做吗?并发的相关设计模式,网上有多文章,但是还不是很系统;希望2015有人能站出来做这件事情,我们好站在巨人的肩膀上继续前行。


其实不是为了学习而学习: 我很大一部分时间还是边开发,边了解标准库,边学习;遇到比较大的通用的模块到github上找有无已经实现的,如有借鉴过来吧,如果你认为自己改写的比原作者好,可以pull request. 当然在开发中遇到自己知识的盲点,就需要有股专研的精神,把它搞明白,技术也就自然得到提高,个人薄见,谨慎参考。





有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:hittata

查看原文:go 语言学习历程

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5847 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传