=Start=
=1.why=
- 互联网时代的C语言
- 语言级别的并行支持(Python的多线程那叫一个鸡肋)
- 语法学习起来相对来说比较简单(在有了C/Python/PHP的编程经验之后)
- 想尝试一门新语言
=2.how=
the way i learn Golang(website/book/blog)
- http://tour.golang.org/
- https://gobyexample.com/
- =
- http://golang.org/doc/code.html
- http://golang.org/doc/effective_go.html
- http://golang.org/doc/faq
- http://golang.org/doc/cmd
- https://golang.org/doc/
- https://golang.org/pkg/
- https://godoc.org/
- https://gowalker.org/
- =
- https://github.com/golang/go/wiki
- https://github.com/golang/go/wiki/Learn
- =
- http://blog.golang.org/error-handling-and-go
- http://blog.golang.org/gos-declaration-syntax
- http://blog.golang.org/profiling-go-programs
- =
- https://github.com/mikespook/Learning-Go-zh-cn
- https://github.com/Unknwon/the-way-to-go_ZH_CN
- https://github.com/qyuhen/book
- https://github.com/astaxie/build-web-application-with-golang
- https://github.com/wonderfo/wonderfogo/wiki
- https://github.com/avelino/awesome-go
- https://github.com/polaris1119/The-Golang-Standard-Library-by-Example
- =
- 《Go语言程序设计(Programming in Go)》
- 《Go语言编程》
=3.what=
就我而言,我现在的学习顺序是:
1.先看
逐个例子的看,慢慢的改例子,然后运行;确保自己理解教程中给出的每一行代码,以及说明文字。
2.再看
《Go语言程序设计(Programming in Go)》
少废话,多动手。边干边学效率是最高的。
3.练习
- 用 Golang 实现平时需要的一些小功能
- Project Eular (每学一门新语言的时候,可以做一遍ProjectEular,复习语法和熟悉特性)
{
- 字符串操作
- 文件操作(内容查找、logging、日志分析、IP库分析、配置文件解析、Json解析、XML解析)
- 数据库操作(MySQL、Postgres、Redis、Mongodb)
- 网络编程(爬虫、暴力破解、网络包抓取/解析)
- 正则表达式
- 加解密、哈希算法
- 去重、排序
- 压缩、解压缩
- 日期操作、邮件操作
- Web开发
- 性能调试
}
4.特性了解
- 字符和字符串,切片slice,映射map,指针
- if / switch / for[…range]
- defer / panic / recover
- init() / main()
- goroutine / select / channel
- package的组织形式
5.源码阅读
- 暂时只能看一些简单的源代码片段;
- 待对Golang的package的组织形式熟悉了一些之后开始找复杂的源码进行阅读学习;
- #ToLearn#
6.项目练习/编写(还没开始……)
……Null……
我觉得学习一门语言最重要的就是做到三点,第一看基础知识,第二学习抄代码,第三学习写代码。
学习某个语言要知道某个语言擅长和不擅长的地方,要会灵活运用、要会扬长避短。在学习了基础的知识(语法)之后,找个目标项目(你所在领域的某些算法或者业务,可以用该种语言实现)去做,一点点积累、思考,只有做项目才能串联所学的知识点、加深对该语言的认识和编程能力。
参考链接:
=EOF=
《 “Go语言学习” 》 有 27 条评论
Golang的正则表达式教程
https://github.com/StefanSchroeder/Golang-Regex-Tutorial
Golang的正则表达式教程
https://golang.org/pkg/regexp/
https://gobyexample.com/regular-expressions
https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/07.3.html
Golang学习 – regexp 包
http://www.cnblogs.com/golove/p/3270918.html
Grumpy —— python 转 go 源码工具
https://github.com/google/grumpy
谷歌推出 Python 性能加速方案
http://www.codingpy.com/article/grumpy-boosts-python-with-go/
为什么说 2017 年你必须要学习 Go 了
http://mp.weixin.qq.com/s/hQLUjvttTPgfd9qO1l-i6A
对《为什么说 2017 年你必须要学习 Go 了》这篇文章的疑惑
https://www.v2ex.com/t/334561
Golang资料集
https://github.com/ty4z2008/Qix/blob/master/golang.md
编写地道的Go代码
http://colobu.com/2017/02/07/write-idiomatic-golang-codes/
Golang 语言基础之一: type, variable, constant
http://xhrwang.me/2014/12/22/golang-fundamentals-1-types-variables-constants.html
一个Golang写的快速的动态json解码工具(Fast Go decoder for dynamic JSON)
https://github.com/a8m/djson
Go面试题答案与解析
https://yushuangqi.com/blog/2017/golang-mian-shi-ti-da-an-yujie-xi.html
https://gocn.io/question/947
https://zhuanlan.zhihu.com/p/26972862
使用 GO 语言在 100 行代码内实现 HTTP(S) 代理
https://medium.com/@mlowicki/http-s-proxy-in-golang-in-less-than-100-lines-of-code-6a51c2f2c38c
系统学习GO,推荐几本靠谱的书?
https://www.zhihu.com/question/30461290
https://github.com/wonderfo/wonderfogo/wiki
http://www.flysnow.org/categories/Golang/
`
基础推荐官方文档,没有什么比这个更清晰了。
其次参考Go指南,练习一遍;
然后再结合《Go语言圣经》这本书,深入理解Go的基础;
然后通过《Go语言实战》这本书进行实践;
最终再通过一些别的第三方库源代码和实践,就可以完全掌握了。
`
Go社区的知识图谱,Knowledge Graph
https://github.com/gocn/knowledge
https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0
GopherChina 2018 keynote 点评
https://liudanking.com/arch/gopherchina-2018-keynote-%E7%82%B9%E8%AF%84/
https://github.com/gopherchina/conference/tree/master/2018
基于Go构建滴滴核心业务平台的实践
https://mp.weixin.qq.com/s/jzP7UoFxw4hic629UGthWw
Go语言最佳实践
http://siddontang.com/2014/05/13/golang-in-procution-review/
http://peter.bourgon.org/go-in-production/
我为什么从python转向go
http://siddontang.com/2015/05/16/why-python-to-go/
深入golang之—goroutine并发控制与通信
http://blog.taohuawu.club/article/40
Goroutine并发调度模型深度解析&手撸一个协程池
http://blog.taohuawu.club/article/42
https://github.com/panjf2000/ants/blob/master/ants_benchmark_test.go
参考百度文库,使用Beego(Golang)开发的开源文库系统
https://github.com/TruthHun/DocHub
Go 语言编程中——「指针」和「值」在参数以及返回值中的选择
Pointers vs. values in parameters and return values
https://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values
`
Methods using receiver pointers are common; the rule of thumb for receivers is, “If in doubt, use a pointer.” 使用接收指针的方法很常见,接收类型的一个法则就是——如果有疑问,使用指针就行。
Slices, maps, channels, strings, function values, and interface values are implemented with pointers internally, and a pointer to them is often redundant.
切片、字典、通道、字符串、函数以及接口,它们内部都是通过指针来实现的,所以指向它们的指针通常是多余的。
Elsewhere, use pointers for big structs or structs you’ll have to change, and otherwise pass values, because getting things changed by surprise via a pointer is confusing.
在其他地方,当要对大的结构体或者你必须改变的结构体使用指针的方式;其它的地方就用传递值的方式,因为通过传递指针而导致内容被意外地改变是比较令人困惑的。
`
一个适合初级 Gopher 练手的项目
https://segmentfault.com/a/1190000017867390
https://github.com/ErikJiang/market_monitor
如何客观评价 Go 语言
https://mp.weixin.qq.com/s/WOvjEQc6Tr3hcZlCu5aLkA
`
优点
1. 简单
2. 兼顾开发效率和性能
3. 语言级别的特性支持
缺点
1. runtime
2. 并不能做到真正高并发高性能
其他
这里谈一下 Golang 自问世以来一直被诟病的几个问题。
1. GC
大概从 1.0 版本以来,GC 就一直被诟病。值得欣慰的是,Golang 的 GC 一直在发展,基本在每个版本都有一定的改进。1.8 版本是 GC 的一个里程碑,使用并发三色标记法的 GC 算法的stw 时间甚至达到了微秒级。目前社区貌似在讨论分代 GC 的方案,这个后面专门写一篇文章细说。
2. 包管理
包管理也是一直被诟病,主要是一直没有一个官方的解决方案。直到去年官方终于开始有行动了,推出了 module,相对来说还是一个很不错的方案。
3. 泛型
Golang 没有支持泛型的很大一个原因是泛型太复杂。尽管很多人说 interface 也能实现泛型功能,但是这个泛型还是有一些本质的区别的。没有泛型确实是一个减分项。
`
一刻钟学会Go语言
https://mp.weixin.qq.com/s/k5CpO6vVSMP4tOYAcAXcqg
https://learnxinyminutes.com/docs/go/
https://learnxinyminutes.com/docs/zh-cn/go-cn/
`
发明Go语言是出于更好地完成工作的需要。Go不是计算机科学的最新发展潮流,但它却提供了解决现实问题的最新最快的方法。
Go拥有命令式语言的静态类型,编译很快,执行也很快,同时加入了对于目前多核CPU的并发计算支持,也有相应的特性来实现大规模编程。
Go语言有非常棒的标准库,还有一个充满热情的社区。
有编程经验的小伙伴,朗诵以下代码块,完成Go语言快速入门。
`
[转]编写高性能的Go代码的最佳实践
https://colobu.com/2017/12/29/best-practices-for-writing-high-performance-Go-code/
https://github.com/dgryski/go-perfbook/blob/master/performance.md
Go语言实战: 编写可维护Go语言代码建议
https://github.com/llitfkitfk/go-best-practice
https://dave.cheney.net/practical-go/presentations/qcon-china.html
源代码阅读方法(附Go语言项目的代码阅读技巧)
https://www.lijiaocn.com/%E6%96%B9%E6%B3%95/2019/05/31/go-code-read-method.html
`
之前在阅读代码方面存在认知误区,一开始就从入口开始阅读,并不停地跳转,试图理清每一个细节。这种方式会让阅读代码的过程比较煎熬,耗费时间长效果却不好,不是正确的做法。正确的做法是先看森林再观树木,即先对整个项目的代码结构有基本认知,摸清项目代码的实现套路,然后按需逐行阅读。
说明
一:摆正认识
二:找到入口
三:梳理目录
四:逐行阅读
Go项目的一些阅读技巧
技巧1:忽视真正入口之前的代码
技巧2:接口的实现一般就在接口定义的下方
技巧3:见到了类似于「类」的结构,要感动地想哭
技巧4:发现套路——类似于框架
`
[译] Go语言测试进阶版建议与技巧
https://pengrl.com/p/32101/
`
阅读本篇文章前,你最好已经知道如何写基本的单元测试。本篇文章共包含3个小建议,以及7个小技巧。
建议一,不要使用框架
建议二,使用”_test”包名
建议三,避免全局常量配置项
技巧一,加载测试数据
技巧二,保存测试时的预期结果至.golden文件中
技巧三,测试时的初始化、清理代码
技巧四,当依赖第三方可执行程序时
技巧五,测试包含os.Exit的代码
技巧六,将mocks、helpers放入testing.go文件中
技巧七,单独处理耗时长的测试
`
万字长文带你深入浅出 Golang Runtime
https://mp.weixin.qq.com/s/gTb9p0WpJ37M5_k9e6xUiQ
`
本文基于 2019.02 发布的 go 1.12 linux amd64 版本, 主要介绍了 Runtime 实现的一点原理和细节, 对大家容易错或者网络上很多错误的地方做一些梳理:
1. Golang Runtime 是个什么? Golang Runtime 的发展历程, 每个版本的改进
2. Go 调度: 协程结构体, 上下文切换, 调度队列, 大致调度流程, 同步执行流又不阻塞线程的网络实现等
3. Go 内存: 内存结构, mspan 结构, 全景图及分配策略等
4. Go GC: Golang GC 停顿大致的一个发展历程, 三色标记实现的一些细节, 写屏障, 三色状态, 扫描及元信息, 1.12 版本相对 1.5 版本的改进点, GC Pacer 等
5. 实践: 观察调度, GC 信息, 一些优化的方式, 几点问题排查的思路, 几个有意思的问题排查
6. 总结: 贯穿 Runtime 的思想总结
`
https://www.zhihu.com/question/20862617/answer/921061289
如何正确的开始用Go编程
https://mp.weixin.qq.com/s/mZwsLf2sgWlzJUWoSKJeeg
《Go语言之旅》
https://tour.go-zh.org/list 了解 Go 语言的基础语法
《Go 入门指南》
https://learnku.com/docs/the-way-to-go 通过了200 多个完整的代码示例和书中的解释说明来对所有涉及到的概念和技巧进行彻底的讲解。
《Go语言程序设计》
https://yar999.gitbooks.io/gopl-zh/content/ 通过学习这本书会对 Go 有更全面的认识,强化自己的Go语言底层基础知识。
《Effective Go 中文版》
https://learnku.com/docs/effective-go/2020 提供编写清晰高效、地道的 Go 代码的技巧。
Go项目目录该怎么组织?官方终于出指南了!
https://tonybai.com/2023/10/05/the-official-guide-of-organizing-go-project/
https://github.com/golang-standards/project-layout/issues/117#issuecomment-828503689
`
长久以来,在Go语言进阶的学习和实践之路上,Go项目目录究竟如何布局一直是困扰大家的一个问题,这是因为Go官方针对这个问题迟迟没有给出说法,更没有提供标准供大家参考。仅有Go语言项目技术负责人Russ Cox在一个开源项目的issue中给出了他关于Go项目结构的最小标准布局的想法。
近期Go官方文档集合中新增了一篇名为“Organizing a Go module”的文档,细读之后,我发现这不就是大家期待已久的Go项目目录布局的官方指南吗!
在这篇文章中,我们就来看看这份官方指南,看看官方推荐的Go项目目录布局是什么样子的。
1. Go项目的类型
我们知道Go项目(project)一般有两类:library和executable。library是以构建库为目的的Go项目,而executable则是以构建二进制可执行文件为目的的Go项目。
“Organizing a Go module”这篇文档总共给出7种项目的布局建议。接下来,我们就来逐一看一下。
2. 官方版Go项目目录布局指南
2.1 basic package
2.2 basic command
2.3 package with supporting packages
2.4 command with supporting packages
2.5 multiple packages
2.6 multiple commands
2.7 multiple packages and commands
3. 小结
经过对“Organizing a Go module”的文档这篇Go官方项目目录布局指南的学习,我发现指南中的建议与我个人在以往文章、书和专栏中对Go项目目录布局的建议非常相近,几乎一致,唯独不同的是在pkg目录的使用上。
在multiple packages类型项目中,如果要导出的package非常多,那么项目顶层目下会有大量的目录,这让项目顶层目录显得很“臃肿”,我个人建议将这些导出包统一放置到project-root-directory/pkg下面,这样项目顶层目录就会显得很简洁。
注:无论是“Organizing a Go module”这篇文档中的官方建议,还是我个人对Go项目目录布局的建议,针对的都是Go项目的基础布局。而像很多Gopher经常问的采用DDD、clean architecture或Hexagonal Architecture(六边形架构)设计的项目的目录布局是一种业务层面的布局,是在基础布局之上进行再设计的,不在本篇的说明范围之内。
`
Organizing a Go module
https://go.dev/doc/modules/layout
`
Basic package
Basic command
Package or command with supporting packages
Multiple packages
Multiple commands
Packages and commands in the same repository
Server project
`