Effective Go-3

Data 分配 通过new和make分配空间: new分配空间,返回指针 make可以进行生成slices,maps,channels,返回类型 package data_test import "testing" func TestCreateslices(t *testing.T) { s := make([]string, 3) s[0] = "c" s[1] = "a" s[2] = "o" t.Log(s) } func TestCreatemap(t *testing.T) { m := make(map[string]int) m["k1"] = 1 m["k2"] = 2 t.Log(m) } func TestCreatechannel(t *testing.T) { messages := make(chan string) go func() { messages <- "ping" }() msg := <-messages t.Log(msg) } 数组(Arrays)和切片(Slices) go中更推荐使用切片而不是数组。 数组长度固定 切片可以动态调整容量(cap) package data_test import "testing" func TestCreatearray(t *testing.T) { a := [...]int{1, 2, 3, 4} t.Log(a) s := make([]int, 4) s = a[0:4] t.Log(s) s = append(s, 5) t.Log(a) t.Log(s) } === RUN TestCreatearray f:\GO\go_test\data\data_test.go:29: [1 2 3 4] f:\GO\go_test\data\data_test.go:32: [1 2 3 4] f:\GO\go_test\data\data_test.go:34: [1 2 3 4] f:\GO\go_test\data\data_test.go:35: [1 2 3 4 5] --- PASS: TestCreatearray (0.00s) 二维切片(Two-dimensional Slices) 下面是二位数组和二位切片的示例。 ...

2021-04-15 · 4 min · 670 words

Effective Go-2

分号 若在一行最后一个标识符为以下类型 数字 字符串常量 特殊标识符号;break continue fallthrough return ++ – ) } 词法分析器会在标识符后添加分号, 与C不同GO很多地方都省略分号。 另在在if for switch select控制结构后要接 “{”, 例如: if i < f() { g() } 而不要写成 if i < f() { g() } 控制结构 if/switch/for If switch语句中可以接受初始化语句 if err := file.Chmod(0664); err != nil { log.Print(err) return err } For 遍历数组,切片,字符串或者map时,可以使用range子句 for key, value := range oldMap { newMap[key] = value } Switch中有两个比较特殊的地方, break跳出指定一个标签范围: Loop: for n := 0; n < len(src); n += size { switch { case src[n] < sizeOne: if validateOnly { break } size = 1 update(src[n]) case src[n] < sizeTwo: if n+1 >= len(src) { err = errShortInput break Loop } if validateOnly { break } size = 2 update(src[n] + src[n+1]<<shift) } } 与C不同他不仅支持整数,枚举还支持类型判断 ...

2021-04-07 · 2 min · 301 words

Effective Go - 1

格式化 为了减少格式化问题带来的争议, 可以使用 gofmt程序对源码进行格式化。 gofmt -w .\src\ch1\main\hello_world.go 注释 每个包都应有一个_P_ackage comment 包注释, 对于多文件程序包,程序包注释仅需要出现在一个文件中,任何一个都可以。 注释中应介绍介绍并包整体功能及有关的信息。 _Doc comment_文档注释最好作为完整的句子使用,它可以进行各种各样的自动演示。 第一句应为单句摘要,以声明的名称开头。 go doc 工具会从 Go 程序和包文件中提取注释以并生成相关文档。 godoc 可以启动本地web服务 godoc -http=:12345 -goroot f:\\go\\gotest 浏览器输入http://127.0.0.1:12345, 即可查看本地f:\go\gotest由注释生成的文档。 命名 _包名;_当一个包被导入后,包名就会成了内容的访问器。按照惯例, 包应当以小写单词来命名,且不应使用下划线或驼峰记法。如 import “bytes”, 如果包名发生冲突可以使用别名方式来解决 另外就是包名应为其_源码目录_的名称。如:src/pkg/encoding/base64 中的包应作为 “encoding/base64” 包的导入者可_通过包名来引用其内容_,避免冲突,bufio.Reader 不会与 io.Reader 发生冲突 Getters go不自动支持getter和setter, 有个名为 owner 的字段,其getter应当名为 Owner(大写,可导出)而非 GetOwner, sett而没有这方面约定 owner := obj.Owner() if owner != user { obj.SetOwner(user) } 接口, 包含一个方法的接口应当以该方法的名称加上 -er 后缀来命名,如 Reader、Writer、 Formatter、CloseNotifier 等。不要用Read、Write、Close、Flush、 String 等请不要用这些名称为自己的方法命名。 书写格式, MixedCaps or mixedCaps 首字母大写或小写的驼峰记法,而不是用下划线链接。 ...

2021-03-07 · 1 min · 81 words

比特币,区块链与自由软件

这篇文章 Open source money: Bitcoin, blockchain, and free software 是出自opensource.com 作者 Aahit Gaba & Heather Meeker 这篇文章主要介绍了加密货币,分布式账本以及与开源的相关的一些问题, 是在学习整理开源协议的文章的是看到作者的这篇文章。 Bitcoin是开源的吗?这个问题源于对三个概念的困惑: 区块链 加密货币 开源软件 什么是区块链? 区块链是使用的主要技术之一,他是又一个一个区块组成,每一个区块除了本身记录信息外,还记录前一个区块的hash值,使得这些区块按顺序链接在一起。而这个hash值就是每个区块的ID,做为区块的标识。通过ID就可以在网路上找到对应区块。就好像电话号码一样,要通过电话给您打电话,不需要知道您的位置,只需知道您的电话号码即可。 由于区块与前一个区块之间互相依赖关系, 所以区块链内容不容易被破坏,所以它可以用来做,商品,交易等数据的审计。同时区块链具有分布式,健壮性特点。 “分布式”是指区块链跨网络上的多个位置同步,而不是由一个中央机构或位置进行维护和控制。 “健壮性”是指从理论上讲,可以入侵该系统,但需要控制超过50%的网络以验证虚假交易。 可以将其视为Wikipedia:尽管任何人都可以更改链,但是除非大多数用户确信更改是有效的,否则这些更改将不会持续。 什么是Bitcoin? 比特币是一种加密货币,是一种通过软件加密保护的货币。 与主权国家发行和支持的货币(例如美元,英镑或印度卢比)不同,比特币不由任何中央银行发行或管理。 它们只能通过最基本的方式进行管理。 任何一种货币都有价值,仅仅是因为经济学家称之为稀缺性。 对于一种货币,这种稀缺性必须人为施加。 毕竟,如果每个人都可以印钱,钱将很快失去其价值。 实际上,比特币具有稀缺性,因为它有固定的供应量2100万枚,因此在加密货币中并不常见。 创建比特币时,对可能存在的比特币数量设置了任意限制。 随着对比特币需求的增加,价值增加,直到最终其价格开始飙升并变得非常不稳定。 如果我们有用比特币可以放入我们自己的钱包中, 钱包的操作类似电子邮箱, 不过访问钱包是我们需要两个密钥, 公钥私钥,公钥就像我们邮箱ID,而私钥就像我们的邮箱密码, 当你使用私钥登录钱包后,就可以通过分布式网络向任何人转移比特币了。而交易的验证需要矿工进行“挖矿”来进行交易验证和记账。 比特币仅仅是加密货币,区块链上的一个应用。 区块链是开源的吗? “源代码”是指源代码,开放源代码许可模型的事实是,许多软件只能以一种形式(二进制形式)执行,而只能以另一种形式(源代码形式)被创造。 二进制文件不易被人更改,因此访问源代码对于更改软件至关重要。 开源模型旨在确保二进制代码的用户可以访问他们正在使用的二进制代码的源代码,以便他们可以检查,理解,修复和改进该软件。区块链是一种技术,可以使用不同的编程语言来实现, 虽然有实现可能有所不同,但是都具有相同的核心功能。正如区块链和比特币的关系,一般与特殊的关系。区块链软件的三个特征: 加密 分布式是账本 去中心化系统 他们每个组件都可以用软件实现,可以开源也可以转悠,比如以太坊使用的是GNU LGPLv3许可, 比特币核心使用MIT许可证。而Hyperledger Fabric基于Apache2.o许可证。另外私有区块链项目,则由公司开发拥有, 有一些已经申请专利。 所以当然人们说区块链是开源的,一般是说区块链系统使用开源软件实现的。 从更一般意义上将区块链是开放的, 开放的数据内容可以被任何人出于任何目的自由的使用,修改,共享。他更代表的是一种开放的文化。 开放标准可以最好地促进安全性,区块链之所以受欢迎部分原因是其安全性, 正如其源代码中说得“given enough eyeballs, all bugs are shallow.”足够多人关注后,所有Bug都将付出水面。 ...

2021-02-24 · 1 min · 80 words

关于Trie

File Searching Using Variable Length Keys 最早提及Trie树的一篇文章 MANY computer applications require the storage of large amounts of information within the computer’s memory where it will be readily available for reference and updating. Quite commonly, more storage space is required than is available in the computer’s high-speed working memory. It is, therefore, a common practice to equip computers with magnetic tapes, disks, or drums, or a combination of these to provide additional storage. This additional storage is always slower in operation than the computer’s working memory and therefore care must be taken when using it to avoid excessive operating time. ...

2021-01-16 · 17 min · 3602 words

Understanding Linux filesystems: ext4 and beyond

这篇文章Understanding Linux filesystems: ext4 and beyond 是出自opensource opensource.com 作者 Jim Salter 文章主要介绍ext简要历史,ext4一些特性及问题, 以及其他一些文件系统. ext发展过程 ext主要经历了MINIX文件系统, ext,ext2, ext3, ext几个阶段。 Minix文件系统 Andrew Tannenbaum 为了教学的目的而开发了MINIX,并于 1987 年发布。Minix有自己的文件系统, 不过比较简单最多只能处理14个字符的文件名,并且只能处理64MB的存储空间。 ext ext是由一名发过软件开发人员 Rémy Card 1992 年实现,同时他也设计了ext2, ext使用VFS抽象层,并且能够支持2G存储,以及255长度的文件名。关于时间戳,ext只有一个. ext2 Rémy Card 发现了ext的局限性,一年后也就是1993年他便设计出了ext2, ext2支持到GB级别文件大小和TB级别的文件系统大小, 但是磁盘碎片, 数据写入安全性上尚存在不足,比如: 如果在将数据写入磁盘时系统崩溃或断电,则容易发生灾难性损坏. ext3 1998年, Stephen Tweedie 改进ext2, 2001合并如2.4.25内核版本主线。ext3实现了日志来解决异常情况下数据写入不一致问题。 像之前的ext2一样,ext3使用16位内部寻址。 这意味着块大小为4K时,它可以处理的最大文件大小为2 TiB,最大文件系统大小为16 TiB。 ext4 Theodore Ts’o , 中文名曹子德 ext3主要开发人员。 2006年,发布ext4, 两年后加入 2.6.28 内核主线。 ext4比较ext3有很多新的特征:可以参见以下链接, https://ext4.wiki.kernel.org/index.php/New_ext4_features 作者文章发表的时候计划开发特征已经实现, 比如Metadata Checksums 3.1 Multiblock Allocation 3.2 Delayed Allocation 3.3 Exceed 32000 subdirectory limit 3.4 directory Inodes reservation 3.5 nsec timestamps 3.6 inode version on disk 3.7 uninitialized block groups 3.8 journal checksumming 3.9 persistent preallocation (fallocate) 3.10 Online Defragmentation 3.11 First Class Quota Support 3.12 Big Allocation Blocks 3.13 Metadata Checksums 3.14 Large file support 3.15 Large directory support ...

2020-09-16 · 1 min · 145 words

出色管理者如何帮助团队成员解决问题

这篇文章Don’t solve problems if you want to be a great manager 是出自medium 作者 Claire Lew 当一个团队管理者遇到团队成员来寻求帮助时,不应当自己立即介入,亲自帮助他们去解决问题,事实上那是在帮倒忙。 管理者的领导力就是可以使团队穿越千难万险,披荆斩棘,到达最终的目的地,并确保成员在旅途中有充分的补给和休息。 做为一个优秀的管理者应当是一名船长,而不是划船的人。 Leadership is stewardship , It’s navigating your team through trecherous waters, around jagged rocks, to the desired destination, and making sure folks feel nourished and rested along the way. 下面看看作者给出的建议,在与员工一对一的会议中, 从以下16个问题开始,而不必亲自解决问题: 你认为问题的根本原因是什么? 你正在考虑哪些可能的解决方案? 每种方案的优点和缺点是什么? 这种情况下你如何定义成功? 你如何知道自己会成功? 最坏的情况是什么? 最有可能的结果是什么? 问题场景中那一部分最不确定,最令人困惑、最难以预测? 你已经做了哪些尝试? 对于你最初选择某一解决方案是出于什么考虑? 还有没有其他的快速的解决方案? 在这个解决方案中有什么风险? 还有没有其他的解决方法? 如果什么都不做会怎样? 这是不是一个非此即彼的选择,你是不是漏掉了什么事情? 是不是有些事情你解释的太快了? 总之,一个出色的管理者应当更多关注团队的能力的培养 ,而不是自己。如果他们不能解决问题,可能是您选择了错误的人。

2020-08-12 · 1 min · 67 words

Why mmap is faster than system calls

原文链接 作者 Alexandra (Sasha) Fedorova 关于mmap为什么比系统调用快,作者通过实验进行了验证,通过连续,随机,进行缓存, 不进行缓存,分为4种情况 文件连续访问且被缓存 文件连续访问且未被缓存 文件随机访问且被缓存 文件随机访问且未被缓存 实验结果发现出去少数例外, mmap比系统调用快2-6倍 通过专业的CPU检测工具可以看到 系统调用 60%左右时间 花费在copy_user_enhanced_fast_string 一个复制到用户空间的函数。 mmap 60%左右的时间花费在__memmove_avx_unaligned_erms和36%时间花在设置页面映射的各种操作上 可以看到两种方式用在复制的时间大概都在60%, mmap复制只用了AVX技术结合CPU预取功能,使mmap的确非常快。 AVX for wiki 是x86架构微处理器中的指令集,由英特尔在2008年3月提出,并在2011年 第一季度发布的Sandy Bridge系列处理器中首次支持[1]。AMD在随后的 2011年第三季度发布的Bulldozer系列处理器中开始支持AVX[2]。AVX指令 集提供了新的特性、指令和编码方案。 AVX是X86指令集的SSE延伸架构,如IA16至IA32般的把寄存器XMM 128bit 提升至YMM 256bit,以增加一倍的运算效率。此架构支持了三运算指令 (3-Operand Instructions),减少在编码上需要先复制才能运算的动 作。在微码部分使用了LES LDS这两少用的指令作为延伸指令Prefix。 为什么内核实现不能使用AVX 因为如果这样做了,那么它将必须在每个系统调用中保存和恢复那些寄存器,这将使内核态到用户态变得更加昂贵。 因此,这是Linux内核中的一个有意识的决定.

2020-07-24 · 1 min · 41 words

为什么x86无法生存-Why x86 won’t survive

前不久, 评估CEO 库克在其全球开发者大宣布,Mac笔记本以及个人电脑将会改用苹果自家的ARM架构处理器。这将是自2006年从PowerPC处理器改用英特尔x86处理器后,又一次CPU架构的调整。下面这篇文章是Medium推送的,不过文章贬低X86中提到的漏洞, 我查了资料其实部分ARM也是存在的。 不过确实是代表了一类观点。 苹果的去INTEL,让我想起了去IOE. 原文链接 Why x86 won’t survive X86是Intel公司1978年发明的一种微处理架构,他应用于大多数笔记本。他被认为是高效的, 可靠的, 直到前一段时间, 2018年发现的一系列漏洞 x86是由Intel创建的微体系结构(是一套开发处理器的指令集架构),最早在1978年面市(Intel 8086)。它为大多数笔记本电脑所采用,并且可能为您现在使用的笔记本电脑使用的就是这一系列的CPU。 直到几个月前,它才被认为是强大,有效和可靠的。 仅在2018年发现的x86体系结构中存在的漏洞和漏洞利用的简短历史记录: Meltdown, Spectre, SMT/Hyper threading found to be a security threat. 好像不是很多? 实际不是这样的。这3个漏洞是最近历史上发现的最主要的漏洞,几乎影响了所有笔记本电脑,台式机和服务器内核。 虽然已针对前两个实施了修复程序,但主要缺点是性能命中率高达15%。 在修复Spectre和Meltdown后不久,SMT/Hyper 已显示出使Intel和AMD CPU上的预测执行缺陷变得更糟。 具有古老而混乱的指令集的x86开始显示它的年龄,并且无法做它曾经可以做的事情。 什么是Speculative Execution?为什么要有它? 这就是ARM的用武之地。ARM出现于1990年(wiki上显示是1983年艾康电脑公司开始设计),是通常用于移动电话的台式机处理器的更新且更轻量的替代品。 如今,大多数智能手机都使用基于ARM的处理器,例如高通的Snapdragon系列,麒麟和苹果的定制7nm A系列处理器。 它们重量轻,功能强大且效率极高。 这些处理器比几年前的某些高端游戏台式机更好,但是它们有一个主要缺点-这就是为什么它们从未在笔记本电脑中使用过的原因。 应用程序兼容性。 几乎每个应用程序都是专门为x86开发的,没有考虑ARM的余地。 但是,这种情况开始有所改变。 谷歌正在帮助高通和微软将其浏览器引入ARM架构的Windows设备。 这是一个缓慢的开始,但这标志着x86结束的开始。 Google 已经看到ARM的发展空间, 苹果和微软也如此,如果他们开始致力于做好ARM兼容性, 那么大多数开发者将效仿并为此架构发布自己的软件, 随着兼容性的增加, 由于速度, 可靠性,安全性和价格原因,更多的用户切换到ARM, 由于X86的明显的漏洞, 更多的人将选择ARM. 当然,这种情况不会在一到两年内发生,但最终会发生。 这将是x86的终结,如果没有它,我们可能会更好。

2020-06-29 · 1 min · 59 words

Timers and time management in the Linux kernel. Part 7.

这篇文章 Timers and time management in the Linux kernel. Part 7. 是出自 linux-insides一书中 Timers and time management 章节 内核版本比对5.7 进行了相关调整, 增加相关备注 Linux内核中与时间相关的系统调用 这是第七章也是最后一章chapter, 它描述了Linux内核中计数器和时间管理相关的内容. 在前面的章节 part, 我们在 x86_64: High Precision Event Timer 和Time Stamp Counter. 内部时间管理是Linux内核中一个有趣的部分, 但是,当然,不仅内核需要time概念. 我们的程序还需要知道时间。这一部分中,我们将考虑实际一些与时间管理相关的 system calls. 这些系统调用: clock_gettime; gettimeofday; nanosleep. 我们将从一个简单的用户空间C 程序开始, 并从standard library 函数执行某些系统调用。由于每个 architecture 提供了自己的某些系统调用实现,因此我们将仅考虑x86_64系统调用的特定实现,因为本书与此体系结构相关。 Additionally, we will not consider the concept of system calls in this part, but only implementations of these three system calls in the Linux kernel. If you are interested in what is a system call, there is a special chapter about this. ...

2020-06-07 · 8 min · 1541 words