Go程序设计语言
Go程序设计语言
- 作者: 【美】艾伦A.A.多诺万 【美】布莱恩W.柯尼汉
- 简介: 本书由《C程序设计语言》的作者Kernighan和谷歌公司Go团队主管AlanDonovan联袂撰写,是学习Go语言程序设计指南。本书共13章,主要内容包括:Go的基础知识、基本结构、基本数据类型、复合数据类型、函数、方法、接口、goroutine、通道、共享变量的并发性、包、go工具、测试、反射等。本书适合作为计算机相关专业的教材,也可供Go语言爱好者阅读。
- 出版时间: 2017-05-02
- ISBN: 9787111558422
- 分类: 计算机-编程设计
- 出版社: 机械工业出版社
- 字数: 199621
- 在线阅读: 微信读书
- 划线数量: 21
- 想法数量: 2
笔记
前言
📌 按值调用的形参传递
💭 call-by-value parameter passing
- ⏱ 2025-01-18 00:59:26 ^19836794-7XhcCnKze
📌 要实现简单性,就要求在项目的一开始就浓缩思想的本质,并在项目的整个生命周期制定更具体的准则,以分辨出哪些变化是好的,哪些是坏的或致命的。
- ⏱ 2025-01-19 01:19:35 ^5-3446-3514
📌 一等公民函数
💭 「一等公民函数」是指在编程语言中,函数可以像其他数据类型(如整数、字符串等)一样被对待。具体来说,一等公民函数具有以下特性:
- 赋值给变量:函数可以被赋值给变量。这意味着函数可以像其他值一样被存储和引用。例如,在Go语言中,可以将函数赋值给变量,并在需要时使用该变量。
- 作为参数传递:函数可以作为参数传递给其他函数。这使得函数可以用于高阶函数,即接受函数作为参数或返回函数的函数。这种特性允许编写更加抽象和通用的代码,提高代码的复用性。
- 作为返回值:函数可以作为其他函数的返回值。这意味着函数可以“返回”其他函数,这在某些编程范式中(如函数式编程)非常有用,可以创建复杂的函数式数据结构。
- 存储在数据结构中:函数可以存储在数据结构中,如数组、对象等。这使得函数可以像其他数据一样被管理和操作,增加了编程的灵活性。
- ⏱ 2025-01-19 01:20:50 ^19836794-7XiKksk0F
📌 默认用UTF-8编码的不可变字符串
- ⏱ 2025-01-19 01:21:16 ^5-3867-3884
📌 Go还提供了变长栈来运行其轻量级线程,或称为goroutine。这个栈初始时非常小,所以创建一个goroutine的成本极低,创建100万个也完全可以接受。
- ⏱ 2025-01-19 22:24:27 ^5-4539-4617
📌 采用go工具构建的项目,仅使用文件和标识符的名字(在极少情况下使用特殊注释),就可以推断出一个项目使用的所有库、可执行文件、测试、性能基准、示例、平台相关变体,以及文档。
- ⏱ 2025-01-19 22:25:12 ^5-4793-4878
📌 Go以一种不同寻常的方式来诠释面向对象程序设计。它没有类继承,甚至没有类。较复杂的对象行为是通过较简单的对象组合(而非继承)完成的。方法可以关联到任何用户定义的类型,而不一定是结构体。具体类型和抽象类型(即接口)之间的关系是隐式的,所以一个具体类型可能会实现该类型设计者没有意识到其存在的接口。
- ⏱ 2025-01-19 23:43:02 ^5-5614-5761
第8章 goroutine和通道
📌 通信顺序进程(Communicating Sequential Process, CSP)
- ⏱ 2025-03-31 18:43:11 ^64-642-687
📌 goroutine和线程之间在数量上有非常大的差别
- ⏱ 2025-04-01 11:01:27 ^64-1244-1269
📌 主goroutine
- ⏱ 2025-04-01 11:01:59 ^64-1346-1356
📌 除了从main返回或者退出程序之外,没有程序化的方法让一个goroutine来停止另一个,但是像我们将要看到的那样,有办法和goroutine通信来要求它自己停止。
- ⏱ 2025-04-01 12:00:10 ^64-2587-2669
8.4 通道
📌 通道是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
- ⏱ 2025-04-01 14:30:50 ^67-427-468
📌 当复制或者作为参数传递到一个函数时,复制的是引用,这样调用者和被调用者都引用同一份数据结构。
- ⏱ 2025-04-01 14:31:19 ^67-842-888
📌 同种类型的通道可以使用==符号进行比较。
- ⏱ 2025-04-01 14:31:37 ^67-937-957
📌 通道有两个主要操作:发送(send)和接收(receive),两者统称为通信。
- ⏱ 2025-04-01 14:31:48 ^67-1025-1064
📌 <-操作符
- ⏱ 2025-04-01 14:31:57 ^67-1117-1125
📌 通道支持第三个操作:关闭(close),它设置一个标志位来指示值当前已经发送完毕,这个通道后面没有值了;关闭后的发送操作将导致宕机。
- ⏱ 2025-04-01 14:32:37 ^67-1444-1510
📌 在一个已经关闭的通道上进行接收操作,将获取所有已经发送的值,直到通道为空;这时任何接收操作会立即完成,同时获取到一个通道元素类型对应的零值。
- ⏱ 2025-04-01 14:33:05 ^67-1510-1580
📌 无缓冲(unbuffered)通道
- ⏱ 2025-04-01 14:33:31 ^67-1891-1908
📌 无缓冲通道上的发送操作将会阻塞,直到另一个goroutine在对应的通道上执行接收操作,这时值传送完成,两个goroutine都可以继续执行。相反,如果接收操作先执行,接收方goroutine将阻塞,直到另一个goroutine在同一个通道上发送一个值。
- ⏱ 2025-04-01 14:33:58 ^67-2329-2456
📌 使用无缓冲通道进行的通信导致发送和接收goroutine同步化。
- ⏱ 2025-04-01 14:34:40 ^67-2485-2517
📌 同步通道
- ⏱ 2025-04-01 14:34:25 ^67-2528-2532