6.从 0 到 1 搭建十亿级包裹 API Versioning从 0 到 1 搭建十亿级包 裹 API Versioning 杨利航 AfterShip 高级研发工程师 这是 API Versioning 吗? 目 录 Why 01 What 02 How 03 Takeaway 04 Why Part 1/4 1. SaaS 产品的特点 2. API 的重要性 3. 我们 API 面临的挑战 1.1 SaaS 产品的特点 SaaS - 多国家/地区 - 多币种 - … 安全性 - AES - RSA - OAuth2.0 - … 1.2.2 AfterShip API 的演进路线 业务量从十万级到十亿级,从没有 API 到高标准的 API。不是因为 API 做好了所以业务增长了,而是良 好的 API 设计才能支撑业务增长。 1.3 我们 API 面临的挑战 挑战一、变更不规律,打乱客户更新计划 向后兼容0 码力 | 28 页 | 2.26 MB | 1 年前3
Go Web编程我一直认为知识是用来分享的,让更多的人分享自己拥有的一切知识这个才是人生最大的快乐。 这本书目前我放在Github上,我现在基本每天晚上抽空会写一些,时间有限、能力有限,所以希望更多的朋友参与到 这个开源项目中来。 撰写方法 撰写方法 文件命名 文件命名 每个章节建立一个md文件,如第11章的第3节,则建立11.3.md 11.3.md。 代码文件 代码文件 代码文件置于 tar.gz,64位系统下载go1.0.3.linux-amd64.tar.gz, 假定你想要安装Go的目录为 $GO_INSTALL_DIR,后面替换为相应的目录路径。 解压缩tar.gz包到安装目录下:tar zxvf go1.0.3.linux-amd64.tar.gz -C $GO_INSTALL_DIR。 设置PATH,export PATH=$PATH:$GO_INSTALL_DIR/go/bin $GOPATH 目录约定有三个子目录: src 存放源代码(比如:.go .c .h .s等) pkg 编译后生成的文件(比如:.a) bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中) 以后我所有的例子都是以mygo作为我的gopath目录 应用目录结构 应用目录结构 建立包和目录:$GOPATH/src/mymath/sqrt.go(包名:"mymath")0 码力 | 295 页 | 5.91 MB | 1 年前3
Go 入门指南(The way to Go)章),结构与方法(第 10 章)和接口(第 11 章)。我们会对 Go 语 言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用 错误处理机制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发 和多核应用的基本技巧的讲解(第 制结构。同时我们也会发现 Go 语言旨在减少不必要的编码工作,这使得 Go 语言的代码更加简洁,从而 比传统的面向对象语言更容易阅读和理解。 与 C++ 或 Java 这些有着庞大体系的语言相比,Go 语言简洁到可以将它整个的装入你的大脑中,而且比 学习 Scala(Java 的并发语言)有更低的门槛,真可谓是 21 世纪的 C 语言! 作为一门系统编程语言,你不应该为 Go 语言的大多数代码示例和练习都和控制台有着密不可分的关系而 包来 达到 Web 应用的 GUI 实现。 我们会经常涉及到一些关于 Go 语言的编码规范,了解和使用这些已经被广泛认同的规范应该是你学习阶 段最重要的实践。我会在书中尽量使用已经讲解的概念或者技巧来解释相关的代码示例,以避免你在不了 解某些高级概念的情况下而感到迷茫。 我们通过 227 个完整的代码示例和书中的解释说明来对所有涉及到的概念和技巧进行彻底的讲解,你可以 Go入门指南 - 20 码力 | 380 页 | 2.97 MB | 1 年前3
Go 入门指南(The way to Go)用(测试数据)表驱动测试 13.10 性能调试:分析并优化 Go 程序 第 14 章 协程(goroutine)与通道(channel) 14.1 什么是协程 14.2 协程间的信道 14.3 协程的同步:关闭通道-测试阻塞的通道 14.4 使用 select 切换协程 14.5 通道、超时和计时器(Ticker) 14.6 协程和恢复(recover) 14.7 新旧模型对比:任务和worker 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18.6 函数 18.7 文件 18.8 协程(goroutine)与通道(channel) 18.9 网络和网页应用 获取知识的时候,发现文档内容有不恰当的地方,请向我们反馈,让我们共同携手,将知识准确、高效且有效地传递 给每一个人。 同时,如果您在日常工作、生活和学习中遇到有价值有营养的知识文档,欢迎分享到 书栈(BookStack.CN) , 为知识的传承献上您的一份力量! 如果当前文档生成时间太久,请到 书栈(BookStack.CN) 获取最新的文档,以跟上知识更新换代的步伐。 文档地址:http://www0 码力 | 466 页 | 4.44 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a第17章:值部 - 为了更容易和更深刻地理解Go中的各种值 第18章:数组、切片和映射 - Go中的首要容器类型 第19章:字符串 第20章:函数 - 函数类型和函数值,以及变长参数个数函数 第21章:通道 - Go特色的并发同步方式 第22章:方法 第23章:接口 - 通过包裹不同具体类型的非接口值来实现反射和多态 第24章:类型内嵌 - 不同于继承的类型扩展方式 第25章:非类型安全指针 第26章:泛型 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 第39章:其它并发同步技术 - 如何使用sync标准库包 第40章:原子操作 - 如何使用sync/atomic标准库包 第41章:Go中的内存顺序保证 第42章:一些常见并发编程错误 关于各种其它主题 的文章。 所以现在《Go语言101》大约有50篇文章。 你曾经的困惑主要包括哪些方面? 一些困惑是关于一些Go语法和语义设计细节的。 一些困惑涉及到某些类型的 值,主要是切片,接口和通道类型。 另外一些涉及到标准包API的使用细节。 你认为造成你曾经的困惑的主要原因是什么? 我觉得最主要的原因是我当时抱着Go是一门非常简单的语言的态度去学习和使 用Go。 持有这种态度阻止了我更深刻地理解Go。0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a第17章:值部 - 为了更容易和更深刻地理解Go中的各种值 第18章:数组、切片和映射 - Go中的首要容器类型 第19章:字符串 第20章:函数 - 函数类型和函数值,以及变长参数个数函数 第21章:通道 - Go特色的并发同步方式 第22章:方法 第23章:接口 - 通过包裹不同具体类型的非接口值来实现反射和多态 第24章:类型内嵌 - 不同于继承的类型扩展方式 第25章:非类型安全指针 第26章:泛型 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 第39章:其它并发同步技术 - 如何使用sync标准库包 第40章:原子操作 - 如何使用sync/atomic标准库包 第41章:Go中的内存顺序保证 第42章:一些常见并发编程错误 于各种其它主 题的文章。 所以现在《Go语言101》大约有50篇文章。 你曾经的困惑主要包括哪些方面? 一些困惑是关于一些Go语法和语义设计细节的。 一些困惑涉及到某些类型的 值,主要是切片,接口和通道类型。 另外一些涉及到标准包API的使用细节。 你认为造成你曾经的困惑的主要原因是什么? 我觉得最主要的原因是我当时抱着Go是一门非常简单的语言的态度去学习和 使用Go。 持有这种态度阻止了我更深刻地理解Go。0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a第17章:值部 - 为了更容易和更深刻地理解Go中的各种值 第18章:数组、切片和映射 - Go中的首要容器类型 第19章:字符串 第20章:函数 - 函数类型和函数值,以及变长参数个数函数 第21章:通道 - Go特色的并发同步方式 第22章:方法 第23章:接口 - 通过包裹不同具体类型的非接口值来实现反射和多态 第24章:类型内嵌 - 不同于继承的类型扩展方式 第25章:非类型安全指针 第26章:泛型 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 目录 2 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 第39章:其它并发同步技术 - 如何使用sync标准库包 第40章:原子操作 - 如何使用sync/atomic标准库包 第41章:Go中的内存顺序保证 第42章:一些常见并发编程错误 关于各种其它主题的文 章。 所以现在《Go语言101》大约有50篇文章。 你曾经的困惑主要包括哪些方面? 一些困惑是关于一些Go语法和语义设计细节的。 一些困惑涉及到某些类型的值,主 要是切片,接口和通道类型。 另外一些涉及到标准包API的使用细节。 你认为造成你曾经的困惑的主要原因是什么? 第0章:关于《Go语言101》 4 我觉得最主要的原因是我当时抱着Go是一门非常简单的语言的态度去学习和使用0 码力 | 591 页 | 21.40 MB | 1 年前3
如何消除程序中的数据竞争-周光远且至少其中一次访问是写操作。 data Thread1 Thread2 data goroutine1 goroutine2 从微观看数据竞争 时间上:多个并发的读写操作被观察到的顺序无法预知。 空间上:并发读写时观察到非预期的数据。 a:1 b:2 a:2 b:1 a:1 b:2 a:2 b:1 a:1 b:1 a:2 b:2 Thread 1 Thread 2 X=100 goroutine 1 goroutine 2 Happens Before Happens Before关系是一种保证,如果a事件Happens Before b事件,那么b事件一定能观察到a事件的结果; In computer science, the happened-before is a relation between the result of two events, such org/ref/mem): goroutine: a := 1 b := a c := b d := c print(d) → → → → channel: 开始发送 发送完成 接收完成 开始接收 无缓冲通道 • 所有通道:开始发送 → 接收完成(同一个数据); • 对于无缓冲channel:开始接收 → 发送完成(同一个数据); 开始发送 接收完成 其他的对于init函数,锁,协程,原子操作,syn0 码力 | 30 页 | 1.92 MB | 1 年前3
Golang 入门笔记位整型 (0 到 65535) uint32 无符号 32 位整型 (0 到 4294967295) uint64 无符号 64 位整型 (0 到 18446744073709551615) int8 有符号 8 位整型 (-128 到 127) int16 有符号 16 位整型 (-32768 到 32767) int32 有符号 32 位整型 (-2147483648 到 2147483647) 2147483647) int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807) 浮点类型 float32 IEEE-754 32位浮点型数 float64 IEEE-754 64位浮点型数 complex64 32 位实数和虚数 complex128 64 位实数和虚数 3. 字符串类型(string) 字 可以直接给某个变量赋一个数字,然后按照格式化输出时 %c, 会输出该字符串对饮的 unicode 字符 6. 字符类型可以进行运算的,相当于一个函数,因为他们都有对应的 Unicode 码 字符类型的本质 1. 字符型 存储到计算机中,需要讲字符对应的码值(整数)找出来 存储:字符串 -> 对应码值--> 二进制 --> 存储 读取:二进制 --> 码值 --> 字符 --> 读取 2. 字符和码值的对应关系是通过字符编码表决定的(是规定好的)0 码力 | 2 页 | 511.29 KB | 1 年前3
Go基础语法宝典相对应的值也会改变。 从概念上面来说 slice 像一个结构体,这个结构体包含了三个元素: 一个指针,指向数组中 slice 指定的开始位置 长度,即 slice 的长度 最大长度,也就是 slice 开始位置到数组的最后位置的长度 // 声明一个含有10个元素元素类型为byte的数组 var ar = [10]byte {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' 里面追加一个或者多个元素,然后返回一个和 slice 一样类型的 slice copy 函数 copy 从源 slice 的 src 中复制元素到目标 dst ,并且返回复制的元素的个数 注: append 函数会改变 slice 所引用的数组的内容,从而影响到引用同一数组的其它 slice 。 但当 slice 中没有剩余空间(即 (cap-len) == 0 )时,此时将动态分配新的数组空间。返回的 函数有两个参数,它们的类型都是 int ,那么第一个变量的类型可以省略 (即 a,b int,而非 a int, b int),默认为离它最近的类型,同理多于2个同类型的变量或者返回值。同时注 意到它的返回值就是一个类型,这个就是省略写法。 多个返回值 Go语言比C更先进的特性,其中一点就是函数能够返回多个值。 直接看例子 func funcName(input1 type1, input20 码力 | 47 页 | 1020.34 KB | 1 年前3
共 71 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8













