百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

初学者入门 Golang 的学习型项目

toyiye 2024-06-21 12:01 10 浏览 0 评论

作者 | asta

1 Golang 在过去一年取得的重要成绩

2017 年可以说是 Go 在云计算取得了领导地位,kubernetes 已经成为了所有云计算公司的底层架构,而且越来越多的互联网公司系统架构迁移到 k8s 上面,例如 github、阿里、腾讯、百度、滴滴、京东等大型企业纷纷拥抱,而这个系统就是 Go 开发的,很多公司都开始大力的投入工程师在 Go 开发中来,Go 一下子就成为了云计算的核心语言,大家应该都听过一个组织叫做 CNCF,云计算基金会组织,下面孵化了一堆的云计算项目,https://www.cncf.io/ 就可以看到基本上 90% 的项目都是 Go 语言开发的,从这个我们可以看出来 Go 已经成为了名副其实的云计算系统语言。

同时又是 Go 在第二领域开始发力的一年,我所说的第二领域就是区块链,大家都知道比特币在过去一年可以说迅速的火爆全球,而它的底层技术区块链技术也是开始获得大家的认知,这个可以说是区块链 1.0 版本应用,而区块链 2.0 版本应用就是智能合约以太坊开始获得所有人的认知,基本上目前大多数做区块链的公司都是基于以太坊进行二次开发,而以太坊的底层正是 Go 开发的,同时 IBM 也开源了他们的 fabric,Fabric 是一个分布式账本平台方案,主要用于运行智能合约,利用可靠的技术以及可插拔方式实现各种商业应用场景的模块化架构,而且这个系统也是 Go 开发的,这两个区块链里面的明星项目都是用 Go 开发的,足以说明 Go 在分布式系统中的地位,这也就是为什么今年开始大批量的金融公司开始招聘 Go 工程师。

2 Golang 最近几次版本更新要点

最近两个大版本分别是 Go1.9 和 Go1.10,我就对于这两个版本里面带来的几个新特性大概的介绍一下。

语言层面

Type alias

我们都知道 Go 代码重构过程中最大的难点就是兼容性,而 Go 里面我们一旦导出的变量、函数等如果想要再次重构,那么就会变得非常困难,这个特性的引入就是为了解决这个问题的,最初由 Robert Griesemer 提出来这个特性的,计划在 1.8 版本加入,但是时间紧迫推迟到了 1.9 版本才加入。

官方对 type alias 的定义非常简单:

An alias declaration binds an identifier to the given type.

我们怎么来理解新增的 type alias 和传统的 type definition 的区别呢?

type T1 T2 // 传统的类型定义 vs.type T1 = T2 // 新增的类型化名

把握住一点:传统的类型定义创造了一个“新类型”,而类型化名并没有创造出“新类型”。

性能优化

编译性能

在 Go 1.9 中,在原先的支持包级别的并行编译的基础上又实现了包函数级别的并行编译,以更为充分地利用多核资源。Go 1.10 的编译性能最大的改变在于 cache 机制的实现。事实证明 cache 机制的使用,在日常开发过程中会很大程度上提升你的工作效率,越是规模较大的项目越是如此。

目标代码的性能

这些年 Go team 在不断优化编译器生成的目标代码的性能,比如在 Go 1.7 版本中引入 ssa 后端。Go 1.10 延续着对目标代码生成的进一步优化,虽说动作远不如引入 ssa 这么大。

GC 性能

GC 的性能一直是广大 Gopher 密切关注的事情,在 Go 1.9 中依旧继续优化和改善,大多数程序使用 1.9 编译后都能得到一定程度的性能提升。1.9 中尤其提到了大内存对象分配性能的显著提升。Go 1.10 在减少内存分配延迟以及 GC 运行时的负担两个方面做了许多工作,但从整体上来看,GC 变化不是很大。

标准库

增加 monotonic clock 支持

2017 年元旦之夜,史上第 27 次闰秒出现,正是因为这个闰秒的出现,欧美知名 CDN 服务商 Cloudflare 的 DNS 出现大规模故障,导致欧美很多网站无法正常被访问。之后,Cloudflare 工程师分析了问题原因,罪魁祸首就在于 golang time.Now.Sub 对时间的度量仅使用了 wall clock,而没有使用 monotonic clock,导致返回负值。一般来说,wall clock 仅用来告知时间,mnontonic clock 才是用来度量时间流逝的。为了从根本上解决问题,Go 1.9 在 time 包中实现了用 monotonic clock 来度量 time 流逝,这以后不会出现时间的“负流逝”问题了。这个改动不会影响到目前大家对 timer 包的方法层面上的使用。

增加 math/bits 包

在一些算法编程中,经常涉及到对 bit 位的操作。Go 1.9 提供了高性能 math/bits package 应对这个问题。

提供了一个支持并发的 Map 类型

Go 原生的 map 不是 goroutine-safe 的,尽管在之前的版本中陆续加入了对 map 并发的检测和提醒,但 gopher 一旦需要并发 map 时,还需要自行去实现。在 Go 1.9 中,标准库提供了一个支持并发的 Map 类型:sync.Map

增加 strings.Builder

strings 包增加一个新的类型:Builder,用于在“拼字符串”场景中替代 bytes.Buffer,由于使用了一些 unsafe 包的黑科技,在用户调用 Builder.String 返回最终拼成的字符串时,避免了一些重复的、不必要的内存 copy,提升了处理性能,优化了内存分配。

支持 profiler labels

通用的 profiler 有时并不能完全满足需求,我们时常需要沿着“业务相关”的执行路径去 Profile。Go 1.9 在 runtime/pprof 包、go tool pprof 工具增加了对 label 的支持。Go team 成员 rakyll 有一篇文章“Profiler labels in go”详细介绍了 profiler labels 的用法,可以参考,这里不赘述了。

3 哪些公司在重点使用 Golang?

目前使用 Golang 的国内国外公司都非常之多,我这边大概的列一下主要的公司

国外公司列表

国内公司列表

更多的公司可以参考这里:https://github.com/golang/go/wiki/GoUsers

4 重要的 Golang 开源项目

目前 Go 里面开源的大项目太多了,大家可以参考我们最近做的知识图谱上面的一些开源项目,包含了云计算、devops、区块链、人工智能、游戏、存储引擎、Web、系统 / 命令行工具、中间件、测试 / 持续交付、文件系统等各方面的开源项目。

详细地址:https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0

5 初学者怎么入手 Golang,推荐一些学习型的项目

我觉得学习一门语言最重要的就是做到三点,第一看基础知识,第二学习抄代码,第三学习写代码

第一点,很多人都觉得上来就动手写,但是你基础的东西都没掌握,怎么写呢?欲速则不达,所以基础的东西还是必须要先掌握好。这里推荐几个基础的入门材料:

  • https://tour.golang.org/#1

  • 邢星翻译的 https://github.com/mikespook/Learning-Go-zh-cn

  • Go byExample https://gobyexample.com/

我觉得你把这几个基础掌握之后就可以开始抄袭代码了, 如果你之前有 PHP 的开发经验, 那么也许我写的这本书对你了解 golang 有帮助, https://github.com/astaxie/build-web-application-with-golang

第二点,我们很多时候开始写代码都是没什么思路,也无从下手,但是我们可以模仿别人写代码,上海俗话里面常说"吃大户,用大户,消灭大户",我们就是"看代码,抄代码,最后自己写代码"。这里给你几个入门级别的代码看看学习一下:

  • https://github.com/hoisie/web 很简单,就是学习他的路由怎么实现的,如何编写自己的路由

  • https://github.com/icub3d/home/ 这是一个 Go+ AngularJS 的实现,看看如何做 API 应用

最后我列一下你可以自己参考去实现的一些功能,我当初培训我们战虎班的同学就是用这些来一起学习的。

  • 日志分析

  • IP 库分析

  • 管理后台查看分析日志

第三点,自己写代码,这个时候就是已经对 golang 有了一定的了解了,那么我们就可以开始做自己的项目了,做项目最想就是快速开发, 那么我就推荐你

  • https://github.com/astaxie/beego 使用 beego 框架可以很快速的开发你的 Web 或者 API 应用

  • https://www.docker.com/ 使用 docker 来做虚拟化

  • https://github.com/nsqio/nsq 学习消息队列,学习 channel 和分布式

  • https://github.com/coreos/etcd 分布式应用

这个阶段就是找各种东西用 golang 来写,多写就会理解越来越深入。

6 福利!福利!

第四届 Gopher China 大会 4 月将在上海举办,今年第一次增加了会前的 Workshop 。本届大会从规模到内容将创历史新高,并继续赠送 GoPher 限量 T 恤。动心了,快戳省钱秘籍:

点击阅读原文报名大会,输入优惠码【Geekbang】,八五折优惠等着你!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码