标签 API 下的文章

以单件方式创建和获取数据库实例

img{512x368}

在屡次的Go用户调查中,使用Go语言进行Web服务/API开发都占据了Go语言用途调查结果的头部位置。下面是知名Go IDE goland的母公司JetBrains最新发布的Go当前状态报告(2021.2.3)中的截图:

img{512x368}

开发Web或API服务,难免会与数据库打交道。如今创建数据库实例并访库的技术已经是很成熟了,于是就有了下面这样的程序结构:

img{512x368}

上面这个图片中,Web服务中的每个要与数据库进行数据交互的包都是自己创建并使用数据库实例,这显然是一种糟糕的设计,它不仅让每个包都耦合外部的第三方数据包,每个包还担负起管理数据库连接的责任,并且在Web服务的整个项目中,还会存在多处获取数据库连接配置、打开关闭数据库等的重复代码。一旦数据库访问代码发生变化,这些包就都得修改一遍。

那么如何优化呢?一个很自然的想法:将创建数据库实例以及对数据库实例的获取封装到一个包中,其他包无需再关心数据库实例的创建与释放,直接获取和使用实例即可,如下面示意图:

img{512x368}

从这段描述来看,这显然是单件(singleton,亦翻译为单例)这个“创建型”模式的应用场景。在这里我们给出一个用Go实现的以单件方式创建和获取数据库实例的demo。

Go语言标准库提供了sync.Once类型,这让Go实现单件模式变得天然简单了。为了模拟上述场景,我们先来描述一下demo项目的结构:

database-singleton
├── Makefile
├── cmd
│   └── main
│       └── main.go
├── conf
│   └── database.conf
├── go.mod
├── go.sum
└── pkg
    ├── config
    │   └── config.go
    ├── db
    │   └── db.go
    ├── model
    │   └── employee.go
    ├── reader
    │   └── reader.go
    └── updater
        └── updater.go

在database-singleton这个repo中:

  • pkg/db就是我们将数据库实例的创建和获取封装到单件中的实现;
  • pkg/reader和pkg/updater则模拟了两个通过单件获取数据库实例并分别读取和更新数据库的包;
  • pkg/config是数据库连接配置的读取包。关于go程序的配置读取方案的一些方案,可以参考我的《写Go代码时遇到的那些问题[第1期]》一文。

我们从cmd/main/main.go中,可以看到整个程序的运行结构:

// github.com/bigwhite/experiments/blob/master/database-singleton/cmd/main/main.go
package main

import (
    "log"
    "os"
    "os/signal"
    "sync"
    "syscall"

    "github.com/bigwhite/testdboper/pkg/config"
    "github.com/bigwhite/testdboper/pkg/db"
    "github.com/bigwhite/testdboper/pkg/reader"
    "github.com/bigwhite/testdboper/pkg/updater"
)

func init() {
    err := config.Init()
    if err != nil {
        panic(err)
    }
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    var quit = make(chan struct{})

    // do some init from db
    _ = db.DB()

    go func() {
        updater.Run(quit)
        wg.Done()
    }()
    go func() {
        reader.Run(quit)
        wg.Done()
    }()

    c := make(chan os.Signal, 1)
    signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)

    _ = <-c
    close(quit)
    log.Printf("recv exit signal...")
    wg.Wait()
    log.Printf("program exit ok")
}

简单解释一下上面main.go中的代码:

  • 在init函数中,我们读取了用于整个程序的配置信息,主要是数据库的连接信息(ip、port、user、password等);
  • 我们启动了两个独立的goroutine,分别运行reader和updater两个模拟数据库读写场景的包;
  • 我们使用quit channel通知两个goroutine退出,并使用sync.WaitGroup来等待两个goroutine的结束(关于goroutine的并发模式的详解,可以参考我的专栏文章《Go并发模型和常见并发模式》
  • 我们使用signal.Notify监听系统信号,并在收到系统信号后做出响应(关于signal包的使用,请参见我的专栏文章《小心被kill!不要忽略对系统信号的处理》)。

在main函数代码中,我们看到了如下调用:

    // do some init from db
    _ = db.DB()

这是在初始化的时候通过单件获取访问数据库的对象实例,但这个不是必须的,只有在初始化需要从数据库读取一些信息时才会用到。

接下来,我们就来看看创建数据库访问实例的单件是如何实现的:

// github.com/bigwhite/experiments/blob/master/database-singleton/pkg/db/db.go
package db

import (
    "fmt"
    "sync"
    "time"

    "github.com/bigwhite/testdboper/pkg/config"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

var once sync.Once

type database struct {
    instance    *gorm.DB
    maxIdle     int
    maxOpen     int
    maxLifetime time.Duration
}

type Option func(db *database)

var db *database

func WithMaxIdle(maxIdle int) Option {
    return func(d *database) {
        d.maxIdle = maxIdle
    }
}
func WithMaxOpen(maxOpen int) Option {
    return func(d *database) {
        d.maxOpen = maxOpen
    }
}

func DB(opts ...Option) *gorm.DB {
    once.Do(func() {
        db = new(database)
        for _, f := range opts {
            f(db)
        }

        dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
            config.Config.Database.User,
            config.Config.Database.Password,
            config.Config.Database.IP,
            config.Config.Database.Port,
            config.Config.Database.DB)
        var err error
        db.instance, err = gorm.Open("mysql", dsn) // database: *gorm.DB
        if err != nil {
            panic(err)
        }

        sqlDB := db.instance.DB()
        if err != nil {
            panic(err)
        }

        if db.maxIdle != 0 {
            sqlDB.SetMaxIdleConns(db.maxIdle)
        }

        if db.maxLifetime != 0 {
            sqlDB.SetConnMaxLifetime(db.maxLifetime)
        }

        if db.maxOpen != 0 {
            sqlDB.SetMaxOpenConns(db.maxOpen)
        }

    })
    return db.instance
}

  • 首先,上述代码使用sync.Once对象辅助实现单件模式,传给once.Do方法的函数在整个程序生命周期中执行且只执行一次。我们就是在这个函数中创建的数据库访问实例;
  • 这里我们使用gorm库承担访问数据库的任务,因此所谓的实例,即gorm.DB类型的指针;
  • gorm.DB类型是并发安全的,我们无需考虑单件返回的实例的并发访问问题;
  • gorm.DB底层使用的是标准库database/sql维护的连接池,因此一旦gorm.DB实例建立成功,对连接的维护也全部交由它去处理,我们在业务层无需考虑保活和断连后重连问题;
  • 这里我们没有将获取单件的函数DB设计为不带参数的函数,而是将其设计为携带可变参数列表的函数,这主要是考虑在初次调用DB函数时,可以对底层的连接池进行设置(MaxIdleConn、MaxLifetime、MaxOpenConn)。其他情况使用时,无需传入任何参数;当然由于返回的是gorm.DB的指针,因此外层也是可以基于该指针自行设置连接池的,但在业务层动态更改连接池属性似乎并不可取;
  • 谈到可变参数函数,这里使用了功能选项(functional option)的设计,更多关于Go语言变长参数的妙用,可以参考我的专栏文章《变长参数函数的妙用》

接下来,我们再看看reader和updater对单件函数db.DB的使用,以reader为例:

// github.com/bigwhite/experiments/blob/master/database-singleton/pkg/reader/reader.go
package reader

import (
    "log"
    "time"

    "github.com/bigwhite/testdboper/pkg/db"
    "github.com/bigwhite/testdboper/pkg/model"
)

func dumpEmployee() {
    var rs []model.Employee // rs: record slice
    d := db.DB()
    d.Find(&rs)
    log.Println(rs)
}

func Run(quit <-chan struct{}) {
    tk := time.NewTicker(5 * time.Second)
    for {
        select {
        case <-tk.C:
            dumpEmployee()

        case <-quit:
            return
        }
    }
}

我们看到,reader的Run函数通过定时器每隔5s读取数据库表employee的内容,并输出。dumpEmployee函数通过db.DB非常容易的获取到访问数据库的实例,再也无需自行管理数据库的打开和关闭操作了。

最后,我们说一下DB连接的释放。我们在上面的代码中并没有看到显式的db连接的释放,因此在这样的程序中,始终都需要访问和操作数据库。释放db连接的时候,也是程序退出的时候,当进程退出,与db之间的连接会自动释放,因此无需再显式释放。

注:对于mysql而言,我们可以通过下面命令查看数据库的当前连接数:

mysql> show status like  'Threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 2     |
| Threads_connected | 3     |
| Threads_created   | 5     |
| Threads_running   | 2     |
+-------------------+-------+
4 rows in set (0.00 sec)

以上示例代码可以在这里 https://github.com/bigwhite/experiments/tree/master/database-singleton 下载 。

附录

  • mysql安装设置(on ubuntu)
// ubuntu 18.04, mysql 5.7.33

安装mysql:

$apt-get install mysql-server mysql-client

查看mysql安装成功与否:

$ps -ef|grep mysql
mysql    23965     1  0 22:55 ?        00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

设置root密码:

$cat /etc/mysql/debian.cnf

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = xxxxxxxxxx
socket   = /var/run/mysqld/mysqld.sock

使用debian-sys-maint/xxxxxxxxxx 登录数据库:

$mysql -u debian-sys-maint -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.33-0ubuntu0.18.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set authentication_string=PASSWORD("root123") where user='root';
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> update user set plugin="mysql_native_password";
Query OK, 1 row affected (0.00 sec)
Rows matched: 4  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

root密码生效:

重启mysql服务后,root密码才能生效。

$systemctl restart mysql.service
  • demo1数据和employee表的创建
>create database demo1;
> CREATE TABLE `employee` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int NOT NULL,
  `gender` varchar(8) NOT NULL,
  `birthday` char(14) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

“Gopher部落”知识星球开球了!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!星球首开,福利自然是少不了的!2020年年底之前,8.8折(很吉利吧^_^)加入星球,下方图片扫起来吧!

Go技术专栏“改善Go语⾔编程质量的50个有效实践”正在慕课网火热热销中!本专栏主要满足广大gopher关于Go语言进阶的需求,围绕如何写出地道且高质量Go代码给出50条有效实践建议,上线后收到一致好评!欢迎大家订阅!目前该技术专栏正在新春促销!关注我的个人公众号“iamtonybai”,发送“go专栏活动”即可获取专栏专属优惠码,可在订阅专栏时抵扣20元哦。

我的网课“Kubernetes实战:高可用集群搭建、配置、运维与应用”在慕课网热卖中,欢迎小伙伴们订阅学习!

img{512x368}

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/。smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻)归档仓库 – https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博:https://weibo.com/bigwhite20xx
  • 微信公众号:iamtonybai
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • “Gopher部落”知识星球:https://public.zsxq.com/groups/51284458844544

微信赞赏:
img{512x368}

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

系统学习Go语言,有这几本书就够了!

img{512x368}

1. Go语言的发展现状

如果从2007年9月20日那个下午三个“程序员大佬”在谷歌总部的一间办公室里进行的一次有关设计一门新编程语言的讨论算起,那么Go语言已经度过了自己的13个年头了。

img{512x368}

Robert Griesemer、Rob Pike和Ken Thompson

如果从2009年11月10日Go语言正式开源发布算起,Go语言也即将迎来自己的第11个生日

img{512x368}

2020年,Go联合创始人Rob Pike在专访中也认可了Go确实已成为云基础架构的语言。在Go即将迎来自己的11个生日的时候,Hacker News有人发起了“Go已超过10岁了,你觉得这门语言如何?”的提问,收到了广泛的关注和回答。国内媒体将这些问答整理后得到的结论是:“人生苦短,我要换Go”

Stackoverflow官博11月2日发表的《Go语言有哪些优点?探讨导致Go语言日益流行的特征 》一文对Go语言的发展趋势描述的贴切:Go语言就像爬行的藤蔓,虽缓慢,但却逐渐占据了开发世界。它正以一种郁郁葱葱的并且在许多方面都很优越的编程能力覆盖着在它之前出现的所有事物
img{512x368}

不管你是否承认,Go在IT就业市场已经成为事实上的“香饽饽”之一,就像一贯不激进的慕课网也在今年双11打出了下面的专题:

img{512x368}

上车,任何时间都不晚! 那么怎么才能踏上Go这一强大且稳健前行的车呢?和其他主流编程语言一样,上车的必经之路:看书

2. 市面上的Go书籍为何这么少

和C、C++、Java、Python等编程语言在市面上的书籍数量相比,Go流行于市面(大陆)上的图书似乎少了很多。其原因笔者觉得有如下几点:

1) 年轻

我们来看看上述几门主流编程语言的诞生时间:

  • java 1995

  • c 1972

  • c++ 1983

  • python 1991

对于很多IT从业者来说,这些语言诞生的时候他们还没出生呢。而2009年末才正式发布的Go和“最年轻”的java之间还有14年的“年龄差”。

Go在国内真正开始快速流行起来大致在2015年第一届GopherChina大会(2015.4月)之后,当时的Go是1.4版本)。同一年下半年发布的Go 1.5实现自举并让GC延迟大幅下降,这引爆了Go在国内的流行。一批又一批程序员成为Gopher,在大厂、初创实践着Go语言。但知识和技能的沉淀和总结需要时间,相信再有5年,国内作者出版的Go语言相关书籍会像雨后春笋版出现在大家的书架上。

2)以品类代名词的身份占据的“领域”还少

提到Web,人们想到的是Java spring;提到深度学习、机器学习、人工智能,人们想到的是python和tensorflow;提到比特币,嵌入式,人们想到的是C;提到游戏,人们想到的是C++;提到前端,人们想到的是Javascript。这些语言在这些垂直领域早早以杀手级框架入场,使得它们成为了这一领域的“品类代名词”,因此与该垂直领域相关的技术书籍都会采用作为该领域“品类代名词”的编程语言编写书中示例等,这样的书也就会被归类为这类语言方面的书籍。

Go语言诞生晚,入场也较晚。Go虽然通过缓慢的“爬行”,覆盖了一些领域并占据优势地位,但还不能说已经成为了该领域的“品类代名词”,比如:云原生、API、微服务、区块链等,因此被垂直领域书籍关联的机会也不像上面那几门语言多。

同时,由于Go“自带电池”,基于Go标准库我们可以实现大部分功能特性,无需依赖过多框架。即便依赖框架,框架本身也不复杂,很少以“某某框架”为主题编写一本技术书籍,这方面远远无法媲美Java和Spring这对“黄金组合”。

3) 引进国外优秀作品需要时间

相对于国内,国外关于Go语言的作品要多不少,但引进国外图书资料需要时机以及时间(找译者翻译)。

3. 系统学习Go语言的书籍列表TOP 5

笔者接触Go语言较早,Go语言相关的中外文书籍几乎都通读过一遍(经典好书读过可不止一遍哦)。Go语言比较简单,如果单单从系统掌握这门语言的角度来看,阅读下面基本书籍就足够了。如果你要学习某些垂直领域的Go应用和技巧,那么期待我后续对垂直领域Go书籍/资料的推荐吧^_^。

这里参考“天下足球”TOP10栏目的方式推荐我心目中掌握Go语言必读的五大好书(每项满分为5分)!

第五名:《The Way To Go》 – Go语言百科全书

img{512x368}

《The Way To Go》是我早期学习Go语言时最喜欢翻看的一本书。该书成书于2012年3月,恰逢Go 1.0版本刚刚发布,作者承诺书中代码均可在Go 1.0版本上编译通过并运行。该书分为4个部分:

  • 为什么学习Go以及Go环境安装入门

  • Go语言核心语法

  • Go高级用法(读写、错误处理、单元测试、并发编程、socket与web编程等)

  • Go应用(常见陷阱、语言应用模式、从性能考量的代码编写建议、现实中的Go应用等)

每部分的每个章节都很精彩,这本书也是目前见到的最全面详实的讲解Go语言的书籍了,我称之为Gopher们的第一本“Go百科全书”

该书作者Ivo Balbaert想必大多数人都不曾耳闻。为了写本文,我特地研究了一下他的作品以及出版时间,发现这个技术作者是很会“抢先机”并且眼光独到。他总是能发现市面刚出现不久但却很有潜力的编程语言并在其他人了解该门语言之前,就编写出类似“The way to Go”这样的为早期语言接纳者提供的详实资料,包括JuliaRust等。在很多人还不知道这些语言名字的时候,他就已经开始学习这些语言,并为这些语言编写出质量很高的“百科全书”式的书籍。

很遗憾,这本书没有中文版。这可能是由于本书出版太早,等国内出版社意识到要引进Go语言方面的书籍时,这本书使用的Go版本又太老了,虽然本书中绝大部分例子依然可以在今天最新的Go编译器下通过编译并运行起来。不过无闻在github上发起了这本书的中译版项目:https://github.com/Unknwon/the-way-to-go_ZH_CN,感兴趣的gopher可以去在线或下载阅读。
此书虽棒,但毕竟年头“久远”,我只能委屈它一下了,将它列在第五位,下面是其各个指数的评分:

  • 作者名气指数:3

  • 关注度指数:3

  • 内容实用指数:4

  • 经典指数:4

总分:14

第四名:《Go 101》 – Go语言规范全方位解读

img{512x368}

这是一本在国外人气和关注度比在国内高的中国人编写的英文书,当然也是有中文版的。

如果仅从书名中的101去判断,你很大可能会认为这仅仅是一本讲解Go入门基础的书,但这本书的内容可远远不止入门这么简单。这本书可大致分为三个部分:

  • Go语法基础

  • Go类型系统与运行时实现

  • 以专题(topic)形式阐述的Go特性、技巧与实践模式

除了第一部分算是101范畴,其余两个部分都是Go语言的高级话题,也是要精通Go必须要掌握的“知识点”。并且,结合Go语言规范,作者对每个知识点的阐述都细致入微并结合大量示例辅助说明。我们知道有关C和C++语言,市面上有一些由语言作者或标准规范委员会成员编写的annotated或rationale书籍(语言参考手册或标准解读),Go 101这本书也可以理解为Go语言的标准解读或参考手册

Go 101这本书是开源电子书,其作者也在国外一些支持自出版的服务商那里做了付费数字出版。这使得这本书相对于其他纸板书有着另外一个优势:与时俱进。在作者的不断努力下,该书的知识点更新基本保持与Go的演化同步,目前其内容已经覆盖了最新的Go 1.15版本

该书作者为国内资深工程师老貘,他花费三年时间“呕心沥血”完成此书并免费奉献给Go社区,值得大家为其大大的点赞!
下面是本书推荐指数的评分:

  • 作者名气指数:3

  • 关注度指数:4

  • 内容实用指数:4

  • 经典指数:4

总分:15

第三名:《Go语言学习笔记》 – Go源码剖析与实现原理探索

img{512x368}

这是一本在国内影响力很大和关注度较高的作品。一来其作者雨痕老师是国内资深工程师,也是2015年第一届GopherChina大会讲师;二来,该作品的前期版本是以开源电子书的形式风险给国内Go社区的;三来,作者在Go源码剖析方便可谓之条理清晰,细致入微。

2016年《Go语言学习笔记》纸版书出版,该书覆盖了当时最新的Go 1.5版本,Go 1.5版本在Go语言演化历史中的分量极高,它不仅实现了Go自举,还让Go GC的延迟下降到绝大多数应用可以将其应用到生产的程度。本书整体上分为两大部分:

  • Go语言详解:以短平快、捞干的来的风格对Go语言语法做了说明,能用示例说明的,绝不用文字做过多修饰。

  • Go源码剖析:这是本书精华,也是最受Gopher关注的部分。这部分对Go运行时神秘的内存分配、垃圾回收、并发调度、channel和defer的实现原理、syn.Pool的实现原理做了细致的源码剖析与原理总结。

随着Go语言演化,其语言和运行时实现一直在变化,但Go 1.5版本的实现是后续版本的基础,因此这本书的剖析非常值得每位Gopher阅读。从雨痕老师的github上最新消息来看,他似乎在编写新版Go语言学习笔记,基于Go 1.12版本,剖析源码是枯燥繁琐的,期待新版Go学习笔记早日与Gopher们见面。
下面是本书各个指数的评分:

  • 作者名气指数:4

  • 关注度指数:4

  • 内容实用指数:4

  • 经典指数:4

总分:16

第二名:《Go语言实战》 – 实战系列(in action)经典之作,紧扣Go语言的精华

img{512x368}

Manning出版社出版的“实战系列(xx in action)”一直是程序员心中高质量和经典的代名词。在出版Go语言实战方面,该出版社也是丝毫不敢怠慢,邀请了Go社区知名的三名明星级作者联合撰写了该书的内容。这三位作者分别是:

  • 威廉·肯尼迪 (William Kennedy) – 知名Go培训师,培训机构Ardan Labs的联合创始人,”Ultimate Go”培训的策划实施者。

  • 布赖恩·克特森 (Brian Ketelsen) – 世界上最知名的Go技术大会 – GopherCon大会的联合发起人和组织者,GopherAcademy创立者,现微软Azure工程师

  • 埃里克·圣马丁 (Erik St.Martin) – 世界上最知名的Go技术大会 – GopherCon大会的联合发起人和组织者

本书并不是大部头,而是薄薄的一本(中文版才200多页),因此你不要期望从本书得到百科全书一样的阅读感。本书的作者们显然也没有想将其写成面面俱到的作品,而是直击要点,即挑出Go语言和其他语言相比与众不同的特点进行着重讲解,这些特点构成了本书的结构框架:

  • 入门:快速上手搭建、编写、运行一个go程序

  • 语法:数组(作为一个类型而存在)、切片和map

  • Go类型系统的与众不同:方法、接口、嵌入类型

  • Go的拿手好戏:并发及并发模式

  • 标准库常用包:log、marshal/unmarshal、io(Reader和Writer)

  • 原生支持的测试

读完这本书,你就掌握了Go语言的精髓之处,这迎合了多数gopher的内心需求。本书中文版译者Googol Lee也是Go圈子里的资深gopher,翻译质量上乘。

下面对本书各个指数的评分:

  • 作者名气指数:5

  • 关注度指数:5

  • 内容实用指数:4

  • 经典指数:4

总分:18

第一名:《Go程序设计语言》 – 人手一本的Go语言“圣经”

如果说由Brian W. KernighanDennis M. Ritchie联合编写的《The C Programming Language》(也称K&R C)是C程序员(甚至是所有程序员)心目中的“圣经”的话,

img{512x368}

那么同样由Brian W. Kernighan(K)参与编写的《The Go Programming Language》(也称tgpl)就是Go程序员心目中的“圣经”。

img{512x368}

本书模仿并致敬“The C Programming Language”的经典结构,从一个”hello, world”示例开始带领大家开启Go语言之旅。第二章程序结构是Go语言这个“游乐园”的向导图,了解它之后,我们就会迫不及待地奔向各个“景点”细致参观。Go语言规范中的所有“景点”在本书中都被覆盖到了,并且由浅入深,循序渐进:从基础数据类型到复合数据类型、从函数、方法到接口、从创新的并发goroutine到传统的基于共享变量的并发,从包、工具链到测试,从反射到低级编程(unsafe包)。作者行文十分精炼,字字珠玑,这与《The C Programming Language》的风格保持了高度的一致。书中的示例在浅显易懂的同时,又极具实用性并突出Go语言的特点(比如:并发web爬虫、并发非阻塞缓存等)。

读完本书后,你会有一种爱不释手,马上还要从头再读一遍的感觉,也许这就是“圣经”的魅力!

本书出版于2015年10月26日,也是既当年中旬Go 1.5这个里程碑版本发布后,Go社区的又一重大历史事件!并且Brian W. Kernighan老爷子的影响力让更多程序员加入到Go阵营,这也或多或少促成了Go成为下一个年度,即2016年年度TIOBE最佳编程语言。能得到Brian W. Kernighan老爷子青睐的编程语言只有C和Go,这也是Go的幸运。当然了如果老爷子是被Rob Pike或Ken Thompson通过私人关系邀请写书的,那就另当别论了,当然这纯属臆测,别当真^_^。

这本书的另一名作者Alan A. A. Donovan也并非等闲之辈,他是Go核心开发团队的成员,专注于Go工具链方面的开发。

现在唯一遗憾的是Brian W. Kernighan老爷子年事已高,不知道Go加入泛型后老爷子是否还有精力更新这本圣经。

该书中文版由七牛团队翻译,总体质量是不错的。建议Gopher们人手购置一本圣经“供奉”起来!^_^

下面对本书各个指数的评分:

  • 作者名气指数:5

  • 关注度指数:5

  • 内容实用指数:5

  • 经典指数:5

总分:20

4. 小结

Go书籍绝非“汗牛充栋”,预计Go增加泛型表达力增强后,市面上会有更多的技术书籍出炉。上面的某些经典也许还会出新版。而市面上Go书籍不多从另外一角度也可以理解成Go语言在国内还有巨大的发展空间与潜力。

努力吧,Gopher们!


只有写书者,才能体会到写者的艰辛!Go专栏:《改善Go语言编程质量的50个有效实践》也是我努力了一年多才打磨雕琢出来的心血之作。自从上线后,收到大家的热烈关注和好评!现在恰逢双11慕课大促,欢迎有意愿在Go这条技术路线上进阶的朋友们订阅,在学习过程中欢迎随时反馈和交流!

img{512x368}

我的网课“Kubernetes实战:高可用集群搭建、配置、运维与应用”在慕课网热卖中!欢迎小伙伴们学习支持!双十一慕课网优惠空前!别错过机会哦!

img{512x368}
微博:https://weibo.com/bigwhite20xx
微信公众号:iamtonybai
博客:tonybai.com
github: https://github.com/bigwhite

微信赞赏:
img{512x368}

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats