目录

1.1 用Go解决现代编程难题

1.1.1 开发速度

1.1.2 并发

1.goroutine

2.通道

1.1.3 Go语言的类型系统

1.类型简单

2.Go 接口对一组行为建模

1.1.4 内存管理

1.2 小结


1.1 用Go解决现代编程难题

C 和 C++这类语言提供了很快的执行速度,而 Ruby 和 Python 这类语言则擅长快速开发。 Go 语言在这两者间架起了桥梁,不仅提供了高性能的语言,同时也让开发更快速。

1.1.1 开发速度

编译 Go 程序时,编译器只会关注那些直接被引用的库,而不是像 Java、 C 和 C++那样,要遍历依赖链中所有依赖的库。因此,很多 Go 程序可以在 1 秒内编译完。在现代硬件上,编译整个 Go语言的源码树只需要 20 秒。

缺点:因为没有从编译代码到执行代码的中间过程,用动态语言编写应用程序可以快速看到输出。代价是,动态语言不提供静态语言提供的类型安全特性,不得不经常用大量的测试套件来避免在运行的时候出现类型错误这类 bug。

1.1.2 并发

Go 语言对并发的支持是这门语言最重要的特性之一。 goroutine 很像线程,但是它占用的内存远少于线程,使用它需要的代码更少。通道( channel)是一种内置的数据结构,可以让用户在不同的 goroutine 之间同步发送具有类型的消息。这让编程模型更倾向于在 goroutine之间发送消息,而不是让多个 goroutine 争夺同一个数据的使用权。

1.goroutine

goroutine 是可以与其他 goroutine 并行执行的函数,同时也会与主程序(程序的入口)并行执行。在其他编程语言中,你需要用线程来完成同样的事情,而在 Go 语言中会使用同一个线程来执行多个 goroutine。例如,用户在写一个 Web 服务器,希望同时处理不同的 Web 请求,如果使用 C 或者 Java,不得不写大量的额外代码来使用线程。在 Go 语言中, net/http 库直接使用了内置的 goroutine。每个接收到的请求都自动在其自己的 goroutine 里处理。 goroutine 使用的内存比线程更少, Go 语言运行时会自动在配置的一组逻辑处理器上调度执行 goroutine。每个逻辑处理器绑定到一个操作系统线程上。

2.通道

通道是一种数据结构,可以让 goroutine 之间进行安全的数据通信。通道可以帮用户避免其他语言里常见的共享内存访问的问题。

并发的最难的部分就是要确保其他并发运行的进程、线程或 goroutine 不会意外修改用户的数据。当不同的线程在没有同步保护的情况下修改同一个数据时,总会发生灾难。在其他语言中,如果使用全局变量或者共享内存,必须使用复杂的锁规则来防止对同一个变量的不同步修改。

为了解决这个问题,通道提供了一种新模式,从而保证并发修改时的数据安全。通道这一模式保证同一时刻只会有一个 goroutine 修改数据。通道用于在几个运行的 goroutine 之间发送数据。

1.1.3 Go语言的类型系统

Go 语言提供了灵活的、无继承的类型系统,无需降低运行性能就能最大程度上复用代码。这个类型系统依然支持面向对象开发,但避免了传统面向对象的问题。Go 开发者使用组合( composition)设计模式,只需简单地将一个类型嵌入到另一个类型,就能复用所有的功能。其他语言也能使用组合,但是不得不和继承绑在一起使用,结果使整个用法非常复杂,很难使用。在 Go 语言中,一个类型由其他更微小的类型组合而成,避免了传统的基于继承的模型。

Go 语言还具有独特的接口实现机制,允许用户对行为进行建模,而不是对类型进行建模。在 Go 语言中,不需要声明某个类型实现了某个接口,编译器会判断一个类型的实例是否
符合正在使用的接口。 Go 标准库里的很多接口都非常简单,只开放几个函数。

1.类型简单

Go 语言不仅有类似 int 和 string 这样的内置类型,还支持用户定义的类型。在 Go 语言中,用户定义的类型通常包含一组带类型的字段,用于存储数据。 Go 语言的用户定义的类型看起来和 C 语言的结构很像,用起来也很相似。不过 Go 语言的类型可以声明操作该类型数据的方法。传统语言使用继承来扩展结构——Client 继承自 User, User 继承自 Entity, Go 语言与此不同,Go 开发者构建更小的类型——Customer 和 Admin,然后把这些小类型组合成更大的类型。

2.Go 接口对一组行为建模

接口用于描述类型的行为。如果一个类型的实例实现了一个接口,意味着这个实例可以执行一组特定的行为。你甚至不需要去声明这个实例实现某个接口,只需要实现这组行为就好。其他的语言把这个特性叫作鸭子类型。

下面是一个 Java 接口的例子:

interface User {public void login();public void logout();
}

在Java 中要实现这个接口,要求用户的类必须满足 User 接口里的所有约束,并且显式声明这个类实现了这个接口。而 Go 语言的接口一般只会描述一个单一的动作。在 Go 语言中,最常使用的接口之一是 io.Reader。这个接口提供了一个简单的方法,用来声明一个类型有数据可以读取。标准库内的其他函数都能理解这个接口。这个接口的定义如下:

type Reader interface {Read(p []byte) (n int, err error)
}

为了实现 io.Reader 这个接口,你只需要实现一个 Read 方法,这个方法接受一个 byte切片,返回一个整数和可能出现的错误。

Go 语言的接口更小,只倾向于定义一个单一的动作。实际使用中,这更有利于使用组合来复用代码。

1.1.4 内存管理

在其他系统语言(如 C 或者 C++)中,使用内存前要先分配这段内存,而且使用完毕后要将其释放掉。追踪内存是否还被使用本身就是十分艰难的事情,而要想支持多线程和高并发,更是难上加难。虽然 Go 语言的垃圾回收会有一些额外的开销,但是编程时,能显著降低开发难度。

1.2 小结

1、Go 语言是现代的、快速的,带有一个强大的标准库。

2、Go 语言内置对并发的支持。

3、Go 语言使用接口作为代码复用的基础模块。

《Go语言实战》读书笔记——关于Go语言的介绍相关推荐

  1. Go语言实战读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...

  2. R语言实战-读书笔记(第1 章 R语言介绍)

    *R语言实战所有学习笔记,如涉及侵权,请联系撤稿.* **标题号与书中标题号对应** R语言实战 第1章 R语言介绍     1.2 R的获取与安装         R可以在CRAN(Comprehe ...

  3. R语言实战-读书笔记整理

    k 不同的叫法 observation + variable/ record + field/ example + attribute 数据集的概念 建立数据的概念  数值型 字符型 逻辑型 实例标识 ...

  4. R语言实战-读书笔记 (第8章 回归)

    *********************************** 与导图结合的脚本文件: 创建脚本:文件--新建脚本程序,将以下代码复制粘贴至脚本内,选中右键运行当前或所选代码. ##回归## ...

  5. R语言实战读书笔记(八)回归

    简单线性:用一个量化验的解释变量预测一个量化的响应变量 多项式:用一个量化的解决变量预测一个量化的响应变量,模型的关系是n阶多项式 多元线性:用两个或多个量化的解释变量预测一个量化的响应变量 多变量: ...

  6. R语言实战读书笔记(五)高级数据管理

    5.2.1 数据函数 abs: sqrt: ceiling:求不小于x的最小整数 floor:求不大于x的最大整数 trunc:向0的方向截取x中的整数部分 round:将x舍入为指定位的小数 sig ...

  7. R语言实战读书笔记(四)基本数据管理

    4.2 创建新变量 几个运算符: ^或**:求幂 x%%y:求余 x%/%y:整数除 4.3 变量的重编码 with(): within():可以修改数据框 4.4 变量重命名 包reshape中有个 ...

  8. Spring4实战读书笔记

    Spring4实战读书笔记 首先,我们需要明白,为什么我们需要引入Spring,也就是说Spring的好处.个人觉得主要是在于两方面解耦和对bean的管理. 第一部分:Spring核心 共分为四个章节 ...

  9. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类 1.教育工具 2.生活工具 3.社交应用 4.定位工具 5.游戏 6.报纸和杂志的阅读器 7.移动办公应用 8.财经工具 9.手机购物应用 10.风景区相关 ...

  10. 机器学习实战---读书笔记: 第11章 使用Apriori算法进行关联分析---2---从频繁项集中挖掘关联规则

    #!/usr/bin/env python # encoding: utf-8''' <<机器学习实战>> 读书笔记 第11章 使用Apriori算法进行关联分析---从频繁项 ...

最新文章

  1. git_修改git历史提交记录
  2. python中导入包出现unresolved reference问题
  3. 应用新安全组 - 每天5分钟玩转 OpenStack(116)
  4. 《集体智慧编程》第九章
  5. Mysql分页加pagebean_Spring+MyBatis+SpringMvc+Mysql+Druid+PageHelper分页实现
  6. 教之初计算机考试函数应用题,教之初计算机考试系统
  7. refreshtoken用mysql_微信access_token和refresh_token保存于redis
  8. Java学习 第三章 数组(一)一维数组
  9. IE与IE内核浏览器的那点事
  10. 多表关联查询_【函数007】 EXCEL多表关联查询实战
  11. python list sort by,python中List的sort方法指南
  12. Qt工作笔记-通过C++使widgets与QQuick交互(包含qml界面对象与C++对象映射)
  13. 算法不会,尚能饭否之栈
  14. linux ubuntu内核安装位置,在Ubuntu中安装或升级内核 linux kernel
  15. 从Ibatis过渡到Mybatis-比较Mybaits较与Ibatis有哪些方面的改进
  16. 如何切图PS切图&网页切图
  17. 凡科服务器物理位置,建设网站教程
  18. nvme协议阅读笔记
  19. 电影——《小萝莉的猴神大叔》
  20. 镜像搬运工 skopeo

热门文章

  1. python写彩票预测软件_python写彩票预测软件
  2. 计算机在数据处理方面的论文,数据挖掘论文3000字范文参考(2)
  3. 介绍:native2ascii命令用法详解
  4. 仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话
  5. EditPlus3破解版下载以及配置java使用教程
  6. 动软代码生成器的使用
  7. sms实现wap push的方法和格式
  8. 【View】之【SimpleWaveView】可多色可刷新的加速球、进度球【demo】
  9. android点击不同次切换不同图片,Android实现简单的上一张、下一张图片切换显示...
  10. 中国十个主要城市10-18年的统计年鉴