《 Kotlin极简教程 》正式预售: 欢迎阅读,大家多多指教
《 Kotlin极简教程 》正式预售: 欢迎阅读,请大家多多指教!!! "Kotlin Minimalist Tutorial" official pre-sale: Welcome to read, please advise!!!
《Kotlin极简教程》正式上架:
点击这里 > 去京东商城购买阅读
点击这里 > 去天猫商城购买阅读
非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~
原创 2017-09-08 东海陈光剑 Kotlin极简教程Kotlin编程社区
正式预售: 《 Kotlin极简教程 》
image.png image.png出版社: 机械工业出版社
ISBN:9787111579939
版次:1
商品编码:12181725
品牌:机工出版
包装:平装
开本:16开
出版时间:2017-09-01
Official pre-sale: "Kotlin minimalist Tutorial"
Publishing House: Machinery Industry Publishing House
ISBN: 9787111579939
Edition: 1
Product Code: 12181725
Brand: Mechanic Publishing
Packing: Paperback
Format: 16 Open
Publication date: 2017-09-01
欢迎阅读,大家多多指教!!!
《Kotlin 极简教程》京东
《Kotlin 极简教程》淘宝天猫
《Kotlin 极简教程》当当网
扫码购买(微信,京东):
image.png image.png 螢幕快照 2017-09-09 20.48.37.png 螢幕快照 2017-09-09 20.48.03.png 螢幕快照 2017-09-09 20.47.27.png编辑推荐
本书由阿里Java程序员撰写,带你快速进入Kotlin世界。本书基于Kotlin 1.1版本,从Kotlin基础知识到动手实战,包含了大量精选示例代码和应用案例。
内容简介
本书从Kotlin的HelloWorld开始,生动讲解Kotlin的基础知识和实战案例,分为两大部分:“基础知识”部分包括语言基础、基本数据类型与类型变量、集合类、泛型、面向对象编程、函数式编程、协程等;“实战”部分包括Kotlin与Java互操作、使用Kotlin集成Spring Boot开发WEB服务端、使用Kotlin集成Gradle开发、使用Kotlin和Anko的Android开发、使用Kotlin DSL、Kotlin文件IO操作与多线程、使用Kotlin Native。本书包含了大量精选示例代码和应用案例,为初学者提供了实用指南,也帮助熟练的Java开发者快速切换到Kotlin。
作者简介
陈光剑,资深开发人员,目前就职于阿里巴巴集团,参与过多种平台工具的开发,具有丰富的平台开发经验,操练过Java、Android、Scala、Groovy等语言进行领域建模、架构设计、工具开发,在工作中积累了大量经验,善于总结,乐于分享,发布过大量技术文章。
精彩书评
学习一门语言一定会涉及图书和资料,本书是不可多得的优秀图书,内容翔实,描述简洁,对编程语言有深刻的理解,融入了自己多年的开发经验......Kotlin非常新,而且发展也非常快,是一门非常有前景的开发语言,我希望Android和Java程序员都能停下来阅读这本Kotlin的图书,能够系统地了解这项技术。——雷卷,阿里巴巴70后Java程序员
目录
序 言
前 言
第一部分 Kotlin语言基础
第1章 Kotlin简介 2
1.1 Kotlin简史 2
1.1.1 Kotlin概述 3
1.1.2 Kotlin元年:2016 3
1.2 快速学习工具 4
1.2.1 云端IDE 4
1.2.2 本地命令行环境搭建 5
1.2.3 使用IntelliJ IDEA 9
1.2.4 使用Eclipse 13
1.2.5 使用Gradle构建Kotlin项目 17
1.2.6 编程语言学习小结 18
1.3 本章小结 20
第2章 快速开始HelloWorld 21
2.1 命令行版HelloWorld 21
2.2 应用程序版HelloWorld 21
2.3 Web RESTful HelloWorld 24
2.4 Android版的HelloWorld 34
2.5 JavaScript版HelloWorld 39
2.6 本章小结 49
第3章 Kotlin语言基础 50
3.1 包 50
3.2 声明变量和值 56
3.3 变量类型推断 57
3.3.1 省去变量类型 57
3.3.2 使用is运算符进行类型检测 59
3.4 字符串与其模板表达式 59
3.5 流程控制语句 60
3.5.1 if表达式 60
3.5.2 when表达式 62
3.5.3 for循环 64
3.5.4 while循环 64
3.5.5 break和continue 65
3.5.6 return 66
3.5.7 标签 69
3.5.8 throw表达式 71
3.6 代码注释 72
3.7 语法与标识符 73
3.7.1 修饰符 73
3.7.2 关键字(保留字) 75
3.7.3 操作符和操作符的重载 81
3.7.4 操作符优先级 82
3.7.5 一元操作符 83
3.7.6 二元操作符 85
3.8 扩展函数和扩展属性 90
3.8.1 扩展函数 90
3.8.2 扩展属性 93
3.9 空指针安全 93
3.10 标准库API简介 96
3.11 本章小结 97
第4章 基本数据类型与类型系统 98
4.1 什么是类型 98
4.2 编译时类型与运行时类型 100
4.2.1 弱类型与强类型 100
4.2.2 静态类型与动态类型 101
4.2.3 显式类型与隐式类型 101
4.3 根类型Any 101
4.4 基本类型 102
4.4.1 数字类型 104
4.4.2 字符类型与转义符 109
4.4.3 布尔类型 111
4.4.4 字符串类型 112
4.4.5 数组类型 117
4.5 可空类型 120
4.5.1 Kotlin中的null 120
4.5.2 可空类型String?与安全调用?. 122
4.5.3 可空性的实现原理 124
4.5.4 可空类型层次体系 126
4.6 kotlin.Unit类型 127
4.7 kotlin.Nothing类型 128
4.8 类型检测与类型转换 131
4.8.1 is与!is运算符 131
4.8.2 as运算符 133
4.9 本章小结 134
第二部分 编程进阶
第5章 集合类 136
5.1 集合类的基本概念 136
5.1.1 集合类是一种数据结构 137
5.1.2 集合类是ADT 137
5.1.3 连续存储和离散存储 138
5.2 Kotlin集合类简介 138
5.3 List 139
5.3.1 创建不可变List 140
5.3.2 创建可变集合MutableList 142
5.3.3 遍历List元素 143
5.3.4 List元素操作函数 146
5.3.5 List集合类的基本运算函数 151
5.3.6 过滤操作函数 159
5.3.7 映射操作函数 166
5.3.8 分组操作函数 169
5.3.9 排序操作符 170
5.3.10 生产操作符 171
5.4 Set 174
5.4.1 空集 174
5.4.2 创建Set 176
5.4.3 使用Java中的Set类 177
5.4.4 Set元素的加减操作plus minus 179
5.5 Map 179
5.5.1 创建Map 180
5.5.2 访问Map的元素 184
5.5.3 Map操作符函数 186
5.6 本章小结 192
第6章 泛型 193
6.1 泛型简介 193
6.1.1 泛型与多态 193
6.1.2 为何引进泛型 194
6.1.3 Java与Kotlin中的泛型 195
6.2 型变 197
6.2.1 Java的类型通配符 197
6.2.2 泛型和数组的型变 201
6.3 Kotlin中的泛型 205
6.3.1 out T与in T 205
6.3.2 声明处型变 206
6.3.3 类型投影 206
6.4 泛型类 207
6.5 泛型函数 208
6.6 本章小结 208
第7章 面向对象编程 209
7.1 面向对象编程思想 209
7.1.1 一切皆是映射 209
7.1.2 二进制01与易经阴阳 211
7.1.3 从面向过程到面向对象 212
7.2 类与构造函数 215
7.2.1 声明类 216
7.2.2 构造函数 216
7.2.3 类的属性 218
7.2.4 函数(方法) 219
7.3 抽象类 219
7.3.1 抽象类的定义 219
7.3.2 抽象函数 220
7.3.3 抽象属性和抽象类 221
7.4 接口 223
7.4.1 接口定义 223
7.4.2 实现接口 224
7.4.3 覆盖冲突 225
7.4.4 接口中的属性 225
7.5 抽象类和接口的差异 226
7.6 继承 227
7.6.1 open类 227
7.6.2 多重继承 228
7.7 枚举类 230
7.7.1 枚举类基本用法 231
7.7.2 初始化枚举值 231
7.7.3 使用枚举常量 232
7.8 注解类 233
7.8.1 声明注解 233
7.8.2 使用注解 234
7.9 单例模式与伴生对象 234
7.9.1 单例模式 234
7.9.2 object对象 235
7.9.3 嵌套object对象 236
7.9.4 匿名object 238
7.9.5 伴生对象 239
7.10 密封类 242
7.11 数据类 243
7.11.1 构造函数中的val/var 243
7.11.2 领域实体类 245
7.11.3 数据类的概念 245
7.11.4 数据类的限制 246
7.11.5 数据类的解构 248
7.11.6 标准数据类Pair和Triple 248
7.12 嵌套类 249
7.12.1 嵌套类:类中的类 249
7.12.2 内部类 250
7.12.3 匿名内部类 250
7.13 委托 252
7.13.1 代理模式 252
7.13.2 类的委托 253
7.13.3 委托属性 255
7.14 本章小结 260
第8章 函数式编程 261
8.1 函数式编程概述 261
8.1.1 函数式编程与面向对象编程 262
8.1.2 函数式编程基本特性 265
8.1.3 函数式编程核心思想 266
8.2 在Kotlin中使用函数式编程 284
8.2.1 Kotlin中的函数 284
8.2.2 扩展函数 286
8.2.3 中缀函数 286
8.2.4 函数参数 287
8.2.5 函数返回类型 289
8.2.6 单表达式函数 289
8.2.7 函数作用域 289
8.2.8 泛型函数 290
8.2.9 高阶函数 290
8.2.10 匿名函数 291
8.2.11 Lambda表达式 291
8.2.12 it:单个参数的隐式名称 292
8.2.13 闭包 292
8.2.14 带接收者的函数字面值 293
8.2.15 具体化的类型参数 293
8.2.16 尾递归tailrec 294
8.3 本章小结 295
第9章 轻量级线程:协程 296
9.1 协程的基本概念 296
9.2 协程的基本操作 297
9.2.1 搭建项目 297
9.2.2 简单协程示例 298
9.2.3 使用launch函数启动协程 299
9.2.4 CommonPool对象 299
9.2.5 挂起函数 301
9.2.6 runBlocking函数 302
9.2.7 等待一个协程任务执行完毕 303
9.2.8 取消协程 306
9.2.9 协程取消失效 307
9.2.10 计算代码协程的取消方式 308
9.2.11 在finally中的协程代码 310
9.2.12 协程中不被取消的代码块 312
9.2.13 设置协程超时时间 313
9.3 挂起函数 314
9.3.1 按默认顺序执行 314
9.3.2 使用异步并发执行 315
9.4 协程上下文与调度器 316
9.4.1 调度和线程 316
9.4.2 父子协程 318
9.5 通道与管道 319
9.5.1 通道vs阻塞队列 319
9.5.2 关闭通道和迭代遍历元素 320
9.5.3 生产者-消费者模式 321
9.5.4 使用管道生产无限序列 322
9.5.5 管道与无穷质数序列 323
9.5.6 通道缓冲区 324
9.5.7 构建无穷惰性序列 324
9.6 协程与线程 325
9.6.1 轻量级的协程 325
9.6.2 协程vs守护线程 326
9.6.3 区别 327
9.6.4 协程的好处 328
9.6.5 Kotlin协程的内部机制 328
9.7 本章小结 329
第10章 Kotlin与Java互操作 330
10.1 在Kotlin中调用Java 330
10.1.1 调用Okhttp库示例 331
10.1.2 使用Java的集合类 332
10.1.3 调用Java中的Getter和Setter 333
10.1.4 调用Java中返回void的方法 334
10.1.5 调用来自Java中的null 335
10.1.6 使用Java的泛型 336
10.1.7 数组的互操作 337
10.1.8 可变参数的互操作 337
10.1.9 检查Java中的异常 337
10.1.10 调用Java的Object方法 338
10.1.11 访问Java静态成员 340
10.1.12 使用Java的反射 340
10.1.13 SAM转换 341
10.2 在Java中调用Kotlin 342
10.2.1 访问Kotlin属性 342
10.2.2 调用Kotlin的包级函数 344
10.2.3 调用Kotlin中的实例字段 347
10.2.4 调用Kotlin中的静态字段 348
10.2.5 调用Kotlin中的静态方法 349
10.2.6 Kotlin与Java的可见性 350
10.2.7 生成默认参数函数的重载 352
10.2.8 显式声明Kotlin中的异常 353
10.2.9 关键字冲突的互操作 355
10.2.10 Nothing类型 355
10.3 类型映射 356
10.4 Kotlin与Java的简单实例对比 357
10.5 本章小结 364
第三部分 综合实战
第11章 使用Kotlin集成Spring Boot开发Web服务端 366
11.1 Spring Boot简介 366
11.2 系统架构技术栈 367
11.3 准备工作 367
11.3.1 创建工程 367
11.3.2 Gradle配置文件说明 369
11.4 数据库层开发 370
11.4.1 Endpoint监控接口 373
11.4.2 实体类 375
11.4.3 数据访问层代码 377
11.5 后端逻辑开发 379
11.5.1 控制器逻辑层 379
11.5.2 启动初始化CommandLine-Runner 380
11.5.3 应用启动类 380
11.5.4 Model数据绑定 382
11.5.5 模板引擎视图页面 383
11.5.6 运行测试 383
11.6 前端后端集成 384
11.6.1 引入前端组件 384
11.6.2 实现写文章模块 386
11.6.3 加上导航栏 388
11.6.4 抽取公共模板文件 389
11.6.5 写文章的控制器层接口 390
11.6.6 前端Ajax请求 390
11.6.7 文章详情页 391
11.6.8 添加Markdown支持 393
11.6.9 文章列表分页搜索 395
11.7 Spring 5.0对Kotlin的支持 397
11.8 本章小结 399
第12章 使用Kotlin集成Gradle开发 400
12.1 使用Gradle构建Kotlin工程 400
12.2 使用Kotlin编写Gradle构建配置文件 405
12.3 本章小结 407
第13章 使用Kotlin和Anko的Android开发 408
13.1 什么是Anko 408
13.2 快速入门实例 409
13.2.1 功能介绍 410
13.2.2 使用Android Studio新建项目 411
13.2.3 设计UI界面主题颜色 415
13.2.4 核心依赖配置 417
13.2.5 代码编写 421
13.2.6 运行测试 435
13.3 本章小结 437
第14章 使用 Kotlin DSL 438
14.1 什么是DSL 439
14.2 Kotlin的DSL特性支持 441
14.3 使用kotlinx.html DSL写前端代码 442
14.4 实现一个极简的HTTP DSL 447
14.5 本章小结 454
第15章 Kotlin 文件IO操作与多线程 455
15.1 Kotlin IO基本操作 455
15.2 正则表达式 463
15.3 Kotlin的多线程 466
15.4 本章小结 469
第16章 使用 Kotlin Native 470
16.1 Kotlin Native简介 470
16.2 快速开始Hello World 471
16.3 Kotlin Native与C语言互操作 477
16.4 Kotlin Native编译器konan简介 486
16.5 本章小结 494
前言/序言
Kotlin是JetBrains团队开发的一门现代的、注重工程实用性的静态类型编程语言,JetBrains团队以开发了世界上最好用的IDE而著称。Kotlin于2010年推出,并在2011年开源。Kotlin充分借鉴并汲取了Java、Scala、Groovy、C#、Gosu、JavaScript、Swift等多门杰出语言的优秀特性,语法简单优雅、表现力丰富、抽象扩展方便、代码可重用性好,同时也支持面向对象和函数式编程的多范式编程。Kotlin可以编译成Java字节码运行在JVM平台和Android平台,也可以编译成JavaScript运行在浏览器环境,而且还可以直接编译成机器码的系统级程序,直接运行在嵌入式、iOS、MacOS/Linux/Windows等没有JVM环境的平台。Kotlin源自产业界,它解决了工程实践中程序设计所面临的真实痛点,例如,类型系统可以避免空指针异常的问题。
我最早是被Kotlin的下面这段代码所吸引:
package com.easy.kotlin
fun compose(f: (B) -> C, g: (A) -> B): (A) -> C {
return { x -> f(g(x)) }
}
fun isOdd(x: Int) = x % 2 != 0
fun length(s: String) = s.length
fun main(args: Array) {
val oddLength = compose(::isOdd, ::length)
val strings = listOf("a", "ab", "abc")
println(strings.f?ilter(oddLength))
}
13行。
这大约是在三年前,当时我在学习Java 8中的函数式编程以及Lambda表达式等新特性。那时,我也对Scala、Groovy、Clojure、Haskell等技术很感兴趣,在伴随着兴趣的学习过程中,我无意中看到了上面那段Kotlin代码,第一眼看到这么优雅的函数式编程风格,尤其是compose函数的定义实现,深深地吸引了我。
Swift使用func关键字声明函数多个c,怪怪的;Groovy、Scala等语言使用def关键字,与函数本义联想不直接;JavaScript使用function关键字又显得死板了些。而Kotlin中的fun则简单优雅地恰到好处,关键还让人自然联想到“乐趣、开心、愉快”这样的意思,使用Kotlin每写一个函数都是充满乐趣的。
我们不妨来看看同样的逻辑实现,如果使用Java 8来写会如何:
package com.easy.kotlin;
import java.util.ArrayList;
import java.util.List;
interface G {
B apply(A a);
}
interface F {
C apply(B b);
}
interface FG {
C apply(A a);
}
public class ComposeFunInJava {
public static void main(String[] args) {
G g = (s) -> s.length();
F f = (x) -> x % 2 != 0;
FG fg = (x) -> f.apply(g.apply(x));
List strings = new ArrayList();
strings.add("a");
strings.add("ab");
strings.add("abc");
List result = new ArrayList();
for (String s : strings) {
if (fg.apply(s)) {
result.add(s);
}
}
System.out.println(result);
}
}
36行,差不多是Kotlin的3倍。
我们知道,Java是一门非常优秀的面向对象语言。但是在函数式编程方面,与其他函数语言相比,还是显得有些笨重与生涩,并且其内在体现出来的思想,依旧是面向对象的思想。
功能强大的Scala语言,复杂性相对较高,学习成本也高,而且Scala与Java的互操作性没有Kotlin好。所以,如果既想方便、流畅地使用Java强大与完善的生态库,又想使用更加先进的编程语言特性,无疑Kotlin是个非常不错的选择。
因此,我立马进入了Kotlin的世界!
Kotlin之前一直是默默无闻的,直到今年(2017年)Google IO大会上,Google宣布正式支持Kotlin为Android的官方开发语言,而且从Android Studio 3.0开始,将直接内置集成Kotlin而无需安装任何的插件。另外,在Spring 5.0 M4中也引入了对Kotlin专门的支持。
在学习和使用Kotlin的过程中,我发现我越来越喜欢Kotlin,它是一门非常优秀、优雅、有趣、流畅实用的语言,绝对值得一试。感谢Kotlin团队!
本书可以说是我对Kotlin的使用和思考过程的粗浅总结。通过本书的写作,我加深了对Kotlin语言及其编程的理解,深刻体会到了学无止境的含义。写书的过程也是我系统学习与思考Kotlin的过程,如果本书能够对你有所帮助,将不胜欣慰。
如何阅读本书
受到Kotlin极简特性的感召,我希望也通过极简的表述,全面介绍Kotlin语言特性以及如何使用Kotlin进行实际项目开发。全书共16章,分为三大部分:第一部分“Kotlin语言基础”包括第14章,介绍如何快速开始使用Kotlin,以及Kotlin语法、基本数据类型和类型系统;第二部分“编程进阶”包括第510章,介绍Kotlin标准库中的集合类、泛型、面向对象编程特性、函数式编程、协程、与Java的互操作;第三部分“综合实战”包括第11~16章,介绍如何使用Kotlin集成Spring Boot、Spring MVC等框架来开发Web服务端应用,如何使用Kotlin开发Android应用,如何使用Kotlin的DSL代码风格,如何操纵文件IO、正则表达式以及多线程,如何定义Kotlin Native与C语言互操作。
建议初学者最好按照顺序来阅读本书,Java程序员可以从第5章开始阅读,直接研究Kotlin的特殊点,C语言程序员可以先读第16章再考虑补充前面的基础知识。
内容简介
本书章节内容如下。
第一部分 “Kotlin语言基础”
第1章是Kotlin语言的简介,带领读者快速学习Kotlin的环境搭建以及常用工具的使用。该章最后还给出一个编程语言学习的小结。通过该章的学习,能够快速进入Kotlin的世界。
第2章是快速开始Hello World,分别给出了使用命令行REPL、可执行应用程序、Web RESTful、Android、JavaScript等平台环境上的HelloWorld示例。
第3章介绍Kotlin语言的基础知识,包括Kotlin语言的关键字与标识符等、表达式与流程控制、运算操作符、函数及其扩展等基本内容。
第4章介绍Kotlin语言的基本类型和类型系统。包括Kotlin的内置基本类型:数字、字符串、布尔、数组等,以及Kotlin中引入的特殊的可空类型。
第二部分 “编程进阶”
第5章介绍Kotlin标准库中的集合类:List、Set、Map。通过该章的学习,我们将了解到Kotlin是如何扩展Java集合库的,这使得写代码更加简单容易。
第6章介绍Kotlin泛型的基本概念、型变以及类型边界等内容。
第7章介绍Kotlin面向对象编程的特性:类与构造函数、抽象类与接口、继承以及多重继承等基础知识,同时介绍了Kotlin中的注解类、枚举类、数据类、密封类、嵌套类、内部类、匿名内部类等。
第8章介绍Kotlin函数式编程的相关内容,其中重点介绍了Kotlin中的高阶函数、Lambda表达式、闭包等核心语法,并给出相应的实例说明。还探讨了关于Lambda演算、Y组合子与递归等函数式编程思想的内容。
第9章介绍Kotlin中的协程,包括协程的创建、执行、取消等操作。在该章的后半部分,主要探讨挂起函数的组合执行、协程上下文与调度器、通道与管道等相关内容。最后,对协程与线程进行了简单比较,简要介绍了Kotlin的协程API库。
第10章介绍Kotlin与Java的互操作。
第三部分 “综合实战”
第11章介绍如何使用Kotlin集成Spring Boot、SpringMVC等框架来开发Web服务端应用,给出了一个完整的开发实例。最后,简单介绍了Spring 5.0中对Kotlin的支持特性。
第12章介绍使用Kotlin集成Gradle开发的相关内容。
第13章介绍如何使用Kotlin开发Android应用的具体方法,其中用到了Anko、ButterKnife、Realm等相关框架。
第14章介绍Kotlin中DSL的相关内容。我们将会看到Kotlin的扩展函数和高阶函数(Lambda表达式)特性,为定义Kotlin DSL提供了极大的支持。使用DSL的代码风格,可以让程序更加直观易懂、简洁优雅。
第15章介绍Kotlin文件IO操作、正则表达式以及多线程相关的内容。
第16章简单介绍了Kotlin Native,并给出了Kotlin与C语言互操作的完整实例。
谁适合阅读本书
本书适合于所有程序员,不管你是前端开发者、Android/iOS开发者,还是Java开发者、C语言开发者,学习Kotlin都会非常容易,本书将帮助读者快速进入Kotlin世界。
如果你目前还不是程序员,但想进入编程世界,那么可以尝试从Kotlin开始学习。虽然本书中的部分内容需要一定的Java编程基础,但是Kotlin本身的极简特性能激发你对编程的兴趣。
代码下载
几乎在每章末尾处,我都附上了该章示例工程源代码地址。这些源码都在https://github.com/EasyKotlin。读者可以根据需要,自由下载学习。
致谢
在本书的写作出版过程中,得到了很多人的帮助和陪伴。
首先要感谢的是我的妻子和两个可爱的孩子。正是有了你们的陪伴,我的生活才更加有意义。我要感谢我的父母,虽然他们可能不知道我写的东西是什么,但是我在写书过程中,脑海里会经常浮现出他们的笑脸,正是由于他们的辛勤养育,我才能长成今天的我。
我要衷心地感谢本书的策划编辑吴怡女士。在本书的写作修改过程中,她耐心细致地对稿件进行了详尽审阅和批注,还提出了很多宝贵的修改建议,并不断给予我鼓励,才使我快速完成了这本书。还感谢审稿编辑陈佳媛、曲熠对本书提出的宝贵意见,同时感谢本书出版过程中所有付出辛劳的华章公司工作人员。
在此,我还要特别感谢我们公司的技术大牛雷卷(陈立兵),非常感谢他能够抽出宝贵时间审阅本书,并给出了内容的勘误,极大地提升了本书的质量,最后,还为本书写了序。真的非常感谢!
我还要感谢在我的工作学习中认识的所有朋友和同事们,能够认识你们并跟你们一起学习、共事,是我的荣幸!
请联系我
虽然在本书写作与修改的过程中,我竭尽全力追求简单正确、清晰流畅地表达内容,但是限于自身水平和有限的时间,仍会有错误与疏漏之处,还望各位读者不吝指正。
对本书的任何问题、意见或者建议,欢迎通过邮件universsky@163.com与我交流。
快乐生活,快乐学习,快乐分享,快乐实践出真知。祝大家阅读愉快!
陈光剑
2017年8月于杭州