搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
Rust编程之道
0.00     定价 ¥ 128.00
图书来源: 浙江图书馆(由JD配书)
此书还可采购17本,持证读者免费借回家
  • 配送范围:
    浙江省内
  • ISBN:
    9787121354854
  • 作      者:
    张汉东
  • 出 版 社 :
    电子工业出版社
  • 出版日期:
    2019-01-01
收藏
编辑推荐

√ Rust,集安全、高性能、高效率、高可读性于一身,是开发一款优秀产品不得不考虑的编程语言,学习Rust势在必行!

√ 本书作者作为Rust语言的早期实践者,以及中国社区的管理运营者,对Rust的设计理念有深入理解,并有丰富的实践经验。

√ 从设计哲学、源码分析、工程视角、底层原理多个维度,对Rust语言进行系统化梳理,帮助读者理清知识脉络,降低学习曲线。

√ 本书附有随书源码,配套运行,方便读者在实践中巩固理论知识,熟悉Rust在生产环境中的应用,避免纸上谈兵的尴尬。

展开
作者简介

张汉东,80后,资深软件工程师、企业独立咨询师、技术作者译者。爱好读书、写作,喜欢研究技术、学习之道,以及心智和认知开发模式。曾在互联网行业沉浮十余载,先后效力于电商、社交游戏、广告和众筹领域。作为企业独立咨询师,先后为思科、平安科技和闪迪等公司提供咨询服务。目前在心智教育及创客领域开疆拓土。是《Ruby原理剖析》一书的译者。喜欢Rust语言,为Rust语言提交了三次编译器Bug,并协助修复其中之一。为官方Rust 2018 Guide做过贡献,并数次提出改进意见。参与了国内Rust社区的管理和运营,在2018年打造了《Rust每日新闻》频道,深受Rustacean们的喜爱。为初学者精心打造了Rust必学第一课:知乎Live《如何系统地学习Rust语言》,获得五星好评。

展开
内容介绍

Rust 是一门利用现代化的类型系统,有机地融合了内存管理、所有权语义和混合编程范式的编程语言。它不仅能科学地保证程序的正确性,还能保证内存安全和线程安全。同时,还有能与C/C++语言媲美的性能,以及能和动态语言媲美的开发效率。

《Rust编程之道》并非对语法内容进行简单罗列讲解,而是从四个维度深入全面且通透地介绍了Rust 语言。从设计哲学出发,探索Rust 语言的内在一致性;从源码分析入手,探索Rust 地道的编程风格;从工程角度着手,探索Rust 对健壮性的支持;从底层原理开始,探索Rust 内存安全的本质。

《Rust编程之道》涵盖了Rust 2018 的特性,适合有一定编程经验且想要学习Rust 的初学者,以及对Rust 有一定的了解,想要继续深入学习的进阶者。

展开
精彩书评

Even though I had to read this book through Google Translate, The Tao of Rust is an extremely interesting book. It starts off explaining exactly why it is different: it's a book that gets you to think about Rust, and its perspective on the world. I only wish I could read it in its native tounge, as I'm sure it's even better then! I have been working on Rust for six years now, and this book changed my perspective on some aspects of the language. That's very powerful!

即便我不得不通过谷歌翻译阅读这本书,但也不难发现《Rust 编程之道》是一本非常有趣的书。它解释了Rust 为何与众不同:这本书可以让你思考Rust,以及Rust 语言所蕴含的世界观。我好希望能读懂中文原版书,因为我相信它会更精彩! 我已经从事Rust 的相关工作六年了,这本书改变了我对Rust 语言的某些看法。这非常强大!

——Steve Klabnik,Rust 官方核心团队成员及文档团队负责人

 

I knew Rust was a notoriously difficult programming language to learn, but it wasn’t until I read the preface to The Tao of Rust, by Alex Zhang, that I realized why it is so difficult. Alex writes:

Rust covers a wide range of knowledge, including object-oriented, functional programming, generics, underlying memory management, type systems, design patterns,and more.

Alex covers all of these topics and more in The Tao of Rust. A single text that ties all of this together will be invaluable for Rust learners. So far I’ve read a couple of chapters translated from the original Chinese, and I can’t wait to read more.

Rust 语言难学,这已经是众所周知的了。但是直到我看到Alex(张汉东)的《Rust 编程之道》的前言时,我才明白它为什么如此难学,Alex 写道:

“Rust 涉及的知识范围非常广泛,涵盖了面向对象、函数式、泛型、底层内存管理、类型系统、设计模式等知识。”

《Rust 编程之道》一书涵盖了所有这些主题和内容,并且将这些内容有机地联系在一起,这对于Rust 的学习者来说是非常宝贵的。我阅读了本书部分内容的英文译稿后,就已经迫不及待地想要阅读更多的内容了。

 —— Patrick Shaughnessy,《Ruby 原理剖析》原著作者

 

Rust 是一门相对难学的语言,我个人认为它的学习曲线比C++的学习曲线更陡峭,但我相信,通过《Rust 编程之道》,大家能快速掌握Rust,体验使用Rust 编程的乐趣,也能更快地在项目中使用Rust 来保证程序的健壮性。如果你遇到了困难,不用害怕,你可以很方便地从Rust 社区得到帮助。

——唐刘,PingCAP 首席架构师,TiKV 负责人

 

Rust 自诞生之初就背上了晦涩难学的名声,以至于很多程序员想学而无法窥得门径。这本《Rust编程之道》是国内Rust社区里难得的优秀作品,它由浅入深,剥茧抽丝,把一个个概念阐释得清晰通透。我们知道,学习一门语言,语法是皮毛,概念是肌理,思想是精髓。汉东在本书的各个章节中,不断地阐述Rust语言的思想和灵魂,帮助读者真正理解 Rust 创作者的苦心。之前我听过汉东做的Rust培训,感觉醍醐灌顶;又看了本书的三章样章,对《Rust 编程之道》便有了满满的期待。

——陈天,ArcBlock(区块基石)技术VP 终于看见由国内资深

 

Rust程序员所写的Rust著作了,本书从语言宗旨到语义逻辑,由浅入深地将Rust语言介绍给国内的读者,相信能够解决目前大部分Rust初学者的问题及疑惑。

——杨梓杰(KiChjang@美国),Rust开发者,Servo资深贡献者

 

本书内容翔实,示例丰富且易于理解,相信能够为读者学习和使用Rust扫清种种障碍。我在一年前首次使用Rust开发了知乎新一代搜索系统,我多么希望那时就能读到这本书,那样就可以解答当时的种种疑惑,并避免一路上所犯的错误和付出的昂贵代价了。

——孙晓光,知乎搜索技术架构Leader

 

BiliBili正尝试在自己的持续集成系统、分布式文件系统、KV系统、缓存系统中使用 Rust语言开发一些组件。Rust本身具备的线程安全、零成本、便利的FFI等特性,使之非常适合开发一些系统底层组件和基础系统。但是,Rust的学习曲线颇陡,需要一本讲解细致、逻辑清晰的书籍作为指导。张老师的这本《Rust编程之道》就非常适合Rust的初学者,值得每一位想了解或深入学习Rust的程序员细细品读。同时也希望Rust在中国乃至世界范围内的影响力越来越大,生态越来越好。

——赵雪松(wayslog),BiliBili高级工程师

 

一年以来,汉东的《Rust每日新闻》为大家提供了极丰富的信息,大大推动了国内Rust社区的发展。《Rust编程之道》正是汉东多年深入探索Rust语言本身以及通用编程之道的匠心之作。愿本书的出版能成为Rust语言在国内推广普及的重要里程碑。感谢汉东的工作!

——唐刚,Rust Web框架Sapper作者

 

Rust语言内存安全,拥有强大的类型系统、高度的抽象表达能力以及方便的FFI,这些特点让它成为了一门前景光明的编程语言。一门好的语言自然需要一位好的引路人,《Rust编程之道》从设计哲学出发,结合代码实践,层次分明、逻辑通透,能帮助读者形成更系统化的理解,是一本优秀的Rust中文书籍。

—— LeetCode(领扣网络)

展开
精彩书摘

当我2015 年开始学习Rust 的时候,我绝对没有想过要写一本Rust 编程的书。

缘起

当时我刚刚翻译完《Ruby 原理剖析》一书,开始对底层开发产生了一点点兴趣。从2006年入行以来,我就一直和动态语言打交道。虽然自己也想学习底层开发,但能选择的语言几乎只有C++。我在学校里浅浅地学过C++这门语言,也许是第一印象作怪,总难以提起对C++的兴趣。

当Rust 1.0 发布时,我去官方网站了解了一下Rust 语言,发现它的主要特点有以下几方面:

 系统级语言

 无GC

 基于LLVM

 内存安全

 强类型+静态类型

 混合编程范式

 零成本抽象

 线程安全

我一下子就被这些鲜明的特性“击中”了,从此开始了Rust 的学习。

再一次爱上编程

第一次爱上编程是在上小学时。父亲给我买回来一台金字塔学习机,这台学习机有两种功能,一种是学习Logo 语言,另一种是玩卡带游戏。编写Logo 语言就是用小海龟画图,也许是因为太早了,也许是因为没有人引导,那时的我选择了痛快地玩游戏。总想着先玩游戏,再去学怎么编程,然后还幻想着能不能用Logo 语言编写一个游戏。其实这时候的我对编程更多的是一种憧憬,并没有在学习编程上付出更多的实际行动。

第二次爱上编程是在大学初次学习C 语言的时候。我本可以选择计算机科学专业,但是最后还是选了电子信息科学与技术专业。这样选是因为我想把软硬件都学了。想法是好的,可惜实施起来并不容易。最后的结果就是,软硬件都没学好。

第三次爱上编程是在遇到Ruby 语言的时候。当时我在用Java,并且已经完全陷入了Java语言和Web 框架纷繁复杂的细节中,痛苦不堪。Ruby on Rails 框架的横空出世,把我从这种状态中解救了出来。Ruby 语言的优雅和自由,以及“让程序员更快乐”的口号深深地吸引了我。这一次我是真正爱上了编程,并且积极付诸行动去学习和提升自己。此时也恰逢互联网创业大潮的开始,Ruby 语言的开发效率让它迅速成为创业公司的宠儿,因此,我也借着Ruby这门语言参与到了这股创业洪流中。

第四次爱上编程是在遇到Rust 的时候。此时,创业洪流已经退潮。技术圈有句话,叫“十年一轮回”。当年喜欢Ruby 给开发过程带来的快乐,但是随着时代的变革和业务规模的增长,我不禁开始重新思考一个问题:何谓快乐?真正的快乐不仅仅是写代码时的“酸爽”,更应该是代码部署到生产环境之后的“安稳”。Rust 恰恰可以给我带来这种“双重快乐”体验。

为什么是Rust

社区中有人模仿阿西莫夫的机器人三大定律,总结了程序的三大定律:

 程序必须正确。

 程序必须可维护,但不能违反第一条定律。

 程序必须高效,但不能违反前两条定律。

程序的正确性,一方面可以理解为该程序满足了实际的问题需求,另一方面是指满足了它自身的程序规约。那么如何保证程序的正确性呢?首先,可以通过对程序的各种测试、断言和错误处理机制,来保证其满足实际的问题需求。其次,在数学和计算机科学已经融合的今天,通过较为成熟的类型理论即可保证程序自身的规约正确。

以我最熟悉的Ruby 语言为例,程序的正确性必须依赖于开发者的水平,并需要大量的测试代码来保证正确性。即便在100%测试覆盖率的条件下,也经常会遇到NilError 之类的空指针问题。也就是说,Ruby 程序自身的正确性还没有得到保证。以此类推,C、C++、Python、Java、JavaScript 等语言都有同样的问题。

而函数式编程语言在这方面要好很多,尤其是号称纯函数式的Haskell 语言,它具有融合了范畴理论的类型系统,利用了范畴理论自身的代数性质和定律保证了程序自身的正确性。然而,Haskell 也有比较明显的缺点,比如它不满足上述第三条定律,运行效率不高。

反观Rust 语言,对程序的三定律支持得恰到好处。它借鉴了Haskell 的类型系统,保证了程序的正确性。但还不止于此,在类型系统的基础上,Rust 借鉴了现代C++的内存管理机制,建立了所有权系统。不仅保证了类型安全,还保证了内存安全。同时,也解决了多线程并发编程中的数据竞争问题,默认线程安全。再来看代码的可维护性,Rust 代码的可读性和抽象能力都是一流的。不仅拥有高的开发效率,还拥有可以和C/C++媲美的性能。当然,没有银弹,但Rust 就是我目前想要的语言。

目前Rust 被陆续应用在区块链、游戏、WebAssembly 技术、机器学习、分布式数据库、网络服务基础设施、Web 框架、操作系统和嵌入式等领域。时代在变化,未来的互联网需要的是安全和性能并重的语言,Rust 必然会在其中大放异彩。

学习Rust 带来了什么收获

Rust 是一门现代化的语言,融合了多种语言特性,而且Rust 语言可以应用的领域范围非常广泛。在学习Rust 的过程中,我发现自己的编程能力在很多方面存在短板。突破这些短板的过程实际上就是一次自我提升的过程。

Rust 是一门成长中的新语言,学习Rust,跟随Rust 一起成长,可以体验并参与到一门真正工业化语言的发展进程中,感觉就像在创造历史。虽然我并未给Rust 语言提交过PR,但也为Rust 语言和社区多次提交过Bug,以及文档和工具的改进意见。

Rust 自身作为一个开源项目,算得上是开源社区中的“明星”项目了。学习Rust 的过程加深了我对开源社区的认识,也开拓了我的眼界。

为什么要写这本书

在学习Rust 一年之后,我写下了《如何学习一门新语言》一文,其中记录了我学习Rust的心得,这篇文章颇受好评。也正因为这篇文章,电子工业出版社的刘恩惠编辑找到了我,并询问是否可以出一本Rust 编程的书籍。我当时也正想通过一本书来完整地表达自己的学习心得,再加上中文社区中没有较全面系统的Rust 书籍,于是,一拍即合。

写书的过程可以形容为痛并快乐着。Rust 语言正值成长期,很多语言特性还在不断地完善。举一个极端的例子,比如写下某段代码示例并成功编译后,过了三天却发现它无法编译通过了。于是,我再一次跟进Rust 的RFC、源码、ChangeLog 去看它们的变更情况,然后再重新修订代码示例。这个过程虽然痛苦,但改完之后会发现Rust 的这个改进确实是有必要的。

在这个过程中,我看到了Rust 的成长,以及Rust 团队为保证语言一致性和开发者的开发体验所付出的努力,让我感觉自己花再多时间和精力去修改本书的内容都是值得的。

话说回来,任何人做事都是有动机或目的的,我也不例外。我写这本书的目的主要有以下三个。

 为Rust 中文社区带来一本真正可以全面系统地学习Rust 的书。

 以教为学。在写作的过程中,让自己所学的知识进一步内化。

 传播一种自学方法。本书内容以Rust 语言的设计哲学为出发点,按照从整体到细节的思路逐个阐述每个语言特性,希望读者可以产生共鸣。

结语

我自己作为本书的第一位读者,目前对这本书是非常满意的。衷心希望每一位读者都能从本书中收获新知。当然,我也知道不可能让每一位读者都满意。在我看来,写书不仅是在传播知识和思想,更是一种交流和沟通。所以,当你不满意的时候,可以来找我交流,提出更多建设性意见,帮助我成长。我争取在写下一本书的时候,让更多的人满意。而且,如果你的建议确实中肯,让我得到了成长,我也为你准备了不错的小礼物。

展开
目录

第1 章 新时代的语言  1

1.1 缘起  1

1.2 设计哲学  3

1.2.1 内存安全  3

1.2.2 零成本抽象  4

1.2.3 实用性  5

1.3 现状与未来  7

1.3.1 语言架构  8

1.3.2 开源社区  9

1.3.3 发展前景  9

1.4 Rust 代码如何执行  10

1.5 小结  10

第2 章 语言精要  11

2.1 Rust 语言的基本构成  11

2.1.1 语言规范  11

2.1.2 编译器  12

2.1.3 核心库  12

2.1.4 标准库  12

2.1.5 包管理器  13

2.2 语句与表达式  13

2.3 变量与绑定  14

2.3.1 位置表达式和值表达式  15

2.3.2 不可变绑定与可变绑定  15

2.3.3 所有权与引用  16

2.4 函数与闭包  17

2.4.1 函数定义  17

2.4.2 作用域与生命周期  18

2.4.3 函数指针  19

2.4.5 CTFE 机制  20

2.4.6 闭包  20

2.5 流程控制  22

2.5.1 条件表达式  22

2.5.2 循环表达式  23

2.5.3 match 表达式与模式匹配  24

2.5.4 if let 和while let 表达式  25

2.6 基本数据类型  26

2.6.1 布尔类型  26

2.6.2 基本数字类型  26

2.6.3 字符类型  27

2.6.4 数组类型  28

2.6.5 范围类型  29

2.6.6 切片类型  29

2.6.7 str 字符串类型  30

2.6.8 原生指针  31

2.6.9 never 类型  31

2.7 复合数据类型  32

2.7.1 元组  32

2.7.2 结构体  33

2.7.3 枚举体  36

2.8 常用集合类型  38

2.8.1 线性序列:向量  38

2.8.2 线性序列:双端队列  39

2.8.3 线性序列:链表  40

2.8.4 Key-Value 映射表:HashMap 和BTreeMap  40

2.8.5 集合:HashSet 和BTreeSet  41

2.8.6 优先队列:BinaryHeap  42

2.9 智能指针  42

2.10 泛型和trait  43

2.10.1 泛型  43

2.10.2 trait  44

2.11 错误处理  47

2.12 表达式优先级  48

2.13 注释与打印  48

2.14 小结  50

第3 章 类型系统  51

3.1 通用概念  51

3.1.1 类型系统的作用  51

3.1.2 类型系统的分类  52

3.1.3 类型系统与多态性  53

3.2 Rust 类型系统概述  53

3.2.1 类型大小  53

3.2.2 类型推导  58

3.3 泛型  60

3.3.1 泛型函数  60

3.3.2 泛型返回值自动推导  62

3.4 深入trait  62

3.4.1 接口抽象  63

3.4.2 泛型约束  69

3.4.3 抽象类型  71

3.4.4 标签trait  77

3.5 类型转换  83

3.5.1 Deref 解引用  83

3.5.2 as 操作符  86

3.5.3 From 和Into  88

3.6 当前trait 系统的不足  89

3.6.1 孤儿规则的局限性  90

3.6.2 代码复用的效率不高  91

3.6.3 抽象表达能力有待改进  93

3.7 小结  94

第4 章 内存管理  95

4.1 通用概念  95

4.1.1 栈  96

4.1.2 堆  99

4.1.3 内存布局  101

4.2 Rust 中的资源管理  103

4.2.1 变量和函数  103

4.2.2 智能指针与RAII  106

4.2.3 内存泄漏与内存安全  110

4.2.4 复合类型的内存分配和布局  115

4.3 小结  117

第5 章 所有权系统  119

5.1 通用概念  120

5.2 所有权机制  123

5.3 绑定、作用域和生命周期  125

5.3.1 不可变与可变  126

5.3.2 绑定的时间属性——生命周期  127

5.4 所有权借用  131

5.5 生命周期参数  135

5.5.1 显式生命周期参数  136

5.5.2 省略生命周期参数  143

5.5.3 生命周期限定  145

5.5.4 trait 对象的生命周期  145

5.6 智能指针与所有权  146

5.6.1 共享所有权 Rc<T>和Weak<T>  149

5.6.2 内部可变性Cell<T>和RefCell<T>  151

5.6.3 写时复制Cow<T>  153

5.7 并发安全与所有权  156

5.8 非词法作用域生命周期  157

5.9 小结  161

第6 章 函数、闭包与迭代器  162

6.1 函数  162

6.1.1 函数屏蔽  164

6.1.2 函数参数模式匹配  164

6.1.3 函数返回值  165

6.1.4 泛型函数  166

6.1.5 方法与函数  167

6.1.6 高阶函数  168

6.2 闭包  171

6.2.1 闭包的基本语法  172

6.2.2 闭包的实现  173

6.2.3 闭包与所有权  178

6.2.4 闭包作为函数参数和返回值  184

6.2.5 高阶生命周期  190

6.3 迭代器  194

6.3.1 外部迭代器和内部迭代器  194

6.3.2 Iterator trait  195

6.3.3 IntoIterator trait 和迭代器  199

6.3.4 迭代器适配器  202

6.3.5 消费器  207

6.3.6 自定义迭代器适配器  211

6.4 小结  214

第7 章 结构化编程  216

7.1 面向对象风格编程  217

7.1.1 结构体  217

7.1.2 枚举体  225

7.1.3 析构顺序  230

7.2 常用设计模式  233

7.2.1 建造者模式  234

7.2.2 访问者模式  236

7.2.3 RAII 模式  239

7.3 小结  243

第8 章 字符串与集合类型  244

8.1 字符串  244

8.1.1 字符编码  244

8.1.2 字符  247

8.1.3 字符串分类  249

8.1.4 字符串的两种处理方式  251

8.1.5 字符串的修改  253

8.1.6 字符串的查找  256

8.1.7 与其他类型相互转换  265

8.1.8 回顾  270

8.2 集合类型  271

8.2.1 动态可增长数组  271

8.2.2 映射集  281

8.3 理解容量  289

8.4 小结  292

第9 章 构建健壮的程序  294

9.1 通用概念  294

9.2 消除失败  295

9.3 分层处理错误  297

9.3.1 可选值Option<T>  298

9.3.2 错误处理Result<T, E>  302

9.4 恐慌(Panic)  314

9.5 第三方库  316

9.6 小结  319

第10 章 模块化编程  320

10.1 包管理  321

10.1.1 使用Cargo 创建包  321

10.1.2 使用第三方包  323

10.1.3 Cargo.toml 文件格式  331

10.1.4 自定义Cargo  337

10.2 模块系统  339

10.3 从零开始实现一个完整功能包  344

10.3.1 使用Cargo 创建新项目  345

10.3.2 使用structopt 解析命令行参数  345

10.3.3 定义统一的错误类型  347

10.3.4 读取CSV 文件  348

10.3.5 替换CSV 文件中的内容  351

10.3.6 进一步完善包  353

10.4 可见性和私有性  358

10.5 小结  360

第11 章 安全并发  362

11.1 通用概念  362

11.1.1 多进程和多线程  363

11.1.2 事件驱动、异步回调和协程  364

11.1.3 线程安全  365

11.2 多线程并发编程  370

11.2.1 线程管理  371

11.2.2 Send 和Sync  375

11.2.3 使用锁进行线程同步  379

11.2.4 屏障和条件变量  384

11.2.5 原子类型  386

11.2.6 使用Channel 进行线程间通信  388

11.2.7 内部可变性探究  397

11.2.8 线程池  399

11.2.9 使用Rayon 执行并行任务  407

11.2.10 使用Crossbeam  409

11.3 异步并发  412

11.3.1 生成器  413

11.3.2 Future 并发模式  418

11.3.3 async/await  421

11.4 数据并行  428

11.4.1 什么是SIMD  429

11.4.2 在Rust 中使用SIMD  430

11.5 小结  434

第12 章 元编程  435

12.1 反射  436

12.1.1 通过is 函数判断类型  436

12.1.2 转换到具体类型  437

12.1.3 非静态生命周期类型  439

12.2 宏系统  440

12.2.1 起源  440

12.2.2 Rust 中宏的种类  441

12.2.3 编译过程  442

12.2.4 声明宏  445

12.2.5 过程宏  458

12.3 编译器插件  472

12.4 小结  475

第13 章 超越安全的边界  477

13.1 Unsafe Rust 介绍  477

13.1.1 Unsafe 语法  478

13.1.2 访问和修改可变静态变量  480

13.1.3 Union 联合体  480

13.1.4 解引用原生指针  483

13.2 基于Unsafe 进行安全抽象  484

13.2.1 原生指针  484

13.2.2 子类型与型变  489

13.2.3 未绑定生命周期  494

13.2.4 Drop 检查  495

13.2.5 NonNull<T>指针  505

13.2.6 Unsafe 与恐慌安全  508

13.2.7 堆内存分配  508

13.2.8 混合代码内存安全架构三大原则  510

13.3 和其他语言交互  510

13.3.1 外部函数接口  510

13.3.2 与C/C++语言交互  514

13.3.3 使用Rust 提升动态语言性能  528

13.4 Rust 与WebAssembly  532

13.4.1 WebAssembly 要点介绍  533

13.4.2 使用Rust 开发WebAssembly  539

13.4.3 打造WebAssembly 开发生态  541

13.5 小结  543

附录A Rust 开发环境指南  544

附录B Rust 如何调试代码  549

展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证