聊聊go语言逃逸分析 1. 从一个例子开始下面是一段c代码,函数getStr生成了a-z的串,我们分别在函数内部和main中对字串进行了输出。//例1.1#include <stdio.h>//返回字串char* getStr(){ //char数组 函数栈上分配内存 char buf[27]; int i; //产生a-z的串 for (i=0; i<sizeof(buf)-1; i++){ buf[i] = i + 'a';
go语言select语句中的求值问题 1. 从一个问题说起package mainimport ( "fmt")var ch0 = make(chan int)var ch1 = make(chan int)var chs = [](chan int){ch0, ch1}func getCh(i int) chan int{ fmt.Printf("get ch:%d", i) return chs[i]}func getNum(i int) int{ fmt.Printf("get num:%d",
PDF Explained(翻译)第七章 文档元数据和导航 本文是对PDF Explained(by John Whitington)第七章《 Document Metadata and Navigation》的摘要式翻译,并加入了一些自己的理解。本章我们讨论四个辅助数据,这些数据并不影响PDF的显示。定位(Destinations):定义文件中位置的数据结构。它们可用于指定书签或超链接指向的位置。书签就是文档的目录。XML元数据: 流数据,包含了特定格式的XML文件,一些与文档信息字典相同的元数据,以及其他字段。文件附件:允许像电子邮件附件那将将整个文件
PDF Explained(翻译)第六章 文本和字体 本文是对PDF Explained(by John Whitington)第六章《Text And Fonts》的摘要式翻译,并加入了一些自己的理解。文本状态文本状态相关的操作符和参数如下表所示:操作符操作数(参数)描述默认值例TccharSpaceTc将字符间距设为charSpace0TwwordSpaceTw将字符间距设为wordSpace0TzscaleTz将水平缩放设置为scale/100100(正常大小)TLleadin
PDF Explained(翻译)第四章 文档结构 本文是对PDF Explained(by John Whitington)第四章《Document Structure》的摘要式翻译。本章我们来看PDF的逻辑结构,涉及trailer字典,文档目录(document catalog)和页面树以及PDF中两种常见结构:文本字符串和日期。一个典型的PDF文档逻辑结构如下图所示:Trailer字典这份字典位于文件尾部而不是文件的主体中,如果程序想要读取PDF文档,首先要做的就是处理trailer字典。字典中的重要条目如下表所示,*表示必选条目。
PDF Explained(翻译)第三章 文件结构 本文是对PDF Explained(by John Whitington)第三章《File Structure》的摘要式翻译。文件布局一个简单全法的PDF文件按顺序可分为如下四部分:header,给出了PDF版本号body,包含了页面,图形内容,和许多辅助信息,它们都编码为一系列对象。交叉引用表,列出了每个对象在文档中的位置,便于随机访问。trailer,包含一个字典,用于定位文件中的各个部分,同时列出了可以在不处理整个文件的情况下读取的各种元数据。再来看下第二章中“Hello World
PDF Explained(翻译)第二章 构建一个简单的PDF 本文是对PDF Explained(by John Whitington)第二章《Building a Simple PDF》的摘要式翻译。本章我们将使用文本编辑器手动构建PDF内容。然后我们将使用 pdftk将其转换为有效的PDF文件,并在PDF查看器中进行查看。关于PDFTK(THE PDF TOOLKIT)pdftk是一个开源的命令行程序,它的功能有:合并分割PDF文档旋转PDF页面加解密填充PDF表单加水印和图章打印和修改PDF元数据(metadata)添加附加基本的PDF
PDF Explained(翻译)第一章 简介 本文是对PDF Explained(by John Whitington)的摘要式翻译。一点历史PDF的发展PDF起初是Adobe的一个内部项目,其目标是创建一种平台无关的文档交换方式。当时PostScript已经在印刷界非常流行,但在当时的电脑屏幕显示上还不是很实用–特别是随机访问方面(如果需要渲染一个PostScript文档的第50页,就必须先处理好前49页)。项目的想法是使用PostScript图片语言的子集加上一些辅助数据来创建一种结构化的语言,可以用于在任何计算机上查看(或打印)文档。P
PDF字体简介 1. PDF字体概述PDF中的文本可以是任何字体。所有的PDF查看器都必须支持5种字体(Times, Helvetica, Courier, Symbol and ZapfDingbats),这些字体可以在任何文档中直接使用。如果想使用其它字体,有如下三种方法:1) 只指明字体的名子。如果使用者的设备上没有该字体,则会使用标准字体显示。2) 内嵌字体当整个字体文件放入PDF文件中。这保证了该字体在任何设备上都可以使用。相应的问题是,这会使用PDF文件变得比较大。3) 内嵌字体子集只在文档中包含
PDF新晋开发者须知 本文是对What new PDF developers need to know的摘要式翻译,同时加入了一些自己的理解。不要将PDF文件当作“文件”当你开始学习HTML时,你可以使用文本编辑器打开一个文件,修改它,然后看看发生了什么。但是你无法对一个PDF文件这样做。 PDF文件本质上是一个二进制数据结构,许多信息是无法直接看到的。哪怕你只修改了其中一个字节都有可能破坏整个文件。PDF即对象(object)PDF文件中包含了大量PDF对象(PDF object)。每个对象有唯一的ID,ID格式如下
《架构简洁之道》思维导图及目录导航 1. 全书思维导图部分结构按笔者理解做了调整2. 目录导航第1部分 概述第2部分 从基础构件开始:编程范式第3部分 设计原则第4部分 组件构建原则第5部分 软件架构第6部分 实现细节
架构整洁之道 30~34章读书笔记 第6部分 实现细节第30章 数据库只是实现细节如果就数据库与整个系统架构的关系打个比方,它们之间就好比是门把手和整个房屋架构的关系。一个优秀的架构师是不会让实现细节污染整个系统架构的。关系型数据库数据按行组织成表结构本身并没有什么系统架构意义上的重要性。应用程序的用例不应该知道,也不应该关心这么低层次的实现细节,需要了解数据表结构的代码应该被局限在系统架构的最外圈、最低层的工具函数中。很多数据访问框架允许将数据行和数据表以对象的形式在系统内部传递。这么做在系统架构上来说是完全错误的,这会导致程序
架构整洁之道 15~29章读书笔记 第5部分 软件架构第15章 什么是软件架构软件架构师自身需要是程序员,并且必须一直坚持做一线程序员,绝对不要听从那些说应该让软件架构师从代码中解放出来以专心解决高阶问题的伪建议。也许软件架构师生产的代码量不是最多的,但是他们必须不停地承接编程任务。如果不亲身承受因系统设计而带来的麻烦,就体会不到设计不佳所带来的痛苦,接着就会逐渐迷失正确的设计方向。设计软件架构的目的,就是为了在工作中更好地对这些组件进行研发、部署、运行以及维护。如果想设计一个便于推进各项工作的系统,其策略就是要在设计中尽可能长时间
架构整洁之道 12~14章读书笔记 第4部分 组件构建原则如果说SOLID原则是用于指导我们如何将砖块砌成墙与房间的,那么组件构建原则就是用来指导我们如何将这些房间组合成房子的。第12章 组件组件是软件的部署单元,是整个软件系统在部署过程中可以独立完成部署的最小实体。在编译运行语言中,组件是一组二进制文件的集合。而在解释运行语言中,组件则是一组源代码文件的集合。无论采用什么编程语言来开发软件,组件都是该软件在部署过程中的最小单元。但无论采用哪种部署形式,设计良好的组件都应该永远保持可被独立部署的特性,这同时也意味着这些组件应该可以被
架构整洁之道 7~11章读书笔记 第3部分 设计原则如果建筑的架构设计不佳,那么其所用的砖头质量再好也没有用。这就是SOLID设计原则所要解决的问题。SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序。我们为软件构建中层结构的主要目标如下:使软件可容忍被改动。使软件更容易被理解。构建可在多个软件系统中复用的组件。SOLID原则应该直接紧贴于具体的代码逻辑之上,这些原则是用来帮助我们定义软件架构中的组件和模块的。SRP:单一职责原则一个软件系统的最佳结构高度依赖于开发这个系统
架构整洁之道 3~6章读书笔记 第2部分 从基础构件开始:编程范式第3章 编程范式总览三个编程范式包括:结构化编程(structured programming)、面向对象编程(object-oriented programming)以及函数式编程(functional programming)。结构化编程结构化编程对程序控制权的直接转移进行了限制和规范。面向对象编程面向对象编程对程序控制权的间接转移进行了限制和规范。函数式编程函数式编程对程序中的赋值进行了限制和规范。仅供思考没有一个范式是增加新能力的。也就是说,每个
架构整洁之道 1~2章读书笔记 第1部分 概述第1章 设计与架构究竟是什么设计(Design)与架构(Architecture)二者没有任何区别。一丁点区别都没有!“架构”这个词往往使用于“高层级”的讨论中。这类讨论一般都把“底层”的实现细节排除在外。而“设计”一词,往往用来指代具体的系统底层组织结构和实现的细节。但是,从一个真正的系统架构师的日常工作来看,这样的区分是根本不成立的。目标是什么软件架构的终极目标是,用最小的人力成本来满足构建和维护该系统的需求。一个软件架构的优劣,可以用它满足用户需求所需要的成本来衡量。龟兔赛
db2gorm -- 将mysql数据表转为gorm struct 0. 为什么写这样一个工具找到的开源工具功能比较多,用起来也复杂些自己定制的更适合自己的项目学习go时间不长,写一款工具也是练习的过程项目地址https://github.com/qmhball/db2gorm1. 功能根据数据库表生成gorm需要的struct。支持指定单表生成,也可以全库生成。比如有如下数据表:Table: UserCreate Table: CREATE TABLE `User` ( `id` int(10) unsigned NOT NULL AUTO_I
gorm hook使用中的问题及核心源码解读 本文针对的是gorm V2版本。hook官方文档可以点击这里,本文旨在对官方文档作一些补充说明。下文中所有的DB均指gorm.Open返回的DB对象。DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})1. hook作用的对象hook只能定义在model上,不能定义在gorm.DB上。假设我们有User表,对应model如下,则可以定义BeforeCreate hook,用于插入数据前的检查。type User struct { I
使用logrus记录gorm sql gorm可以方便的输出执行的sql或慢查询。logrus是常用的日志组件,如何将gorm输出的sql通过logrus记录到日志中呢?1. 代码实现我们先看代码。思路:使用logrus,实现gorm/logger.Writer接口var DB *gorm.DB//定义自己的Writertype MyWriter struct { mlog *logrus.Logger}//实现gorm/logger.Writer接口 func (m *MyWriter)Printf(format st