<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>笔记 on ༺KO༒NE༻</title><link>https://kone.js.cn/categories/%E7%AC%94%E8%AE%B0/</link><description>Recent content in 笔记 on ༺KO༒NE༻</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 06 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kone.js.cn/categories/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux学习笔记</title><link>https://kone.js.cn/p/note-linux/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>https://kone.js.cn/p/note-linux/</guid><description>&lt;img src="https://kone.js.cn/" alt="Featured image of post Linux学习笔记" /&gt;&lt;h2 id="本书结构"&gt;本书结构
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;第一部分&lt;/strong&gt;：Linux				 1-10&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二部分&lt;/strong&gt;：编写shell脚本		 11-16&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三部分&lt;/strong&gt;：深入shell脚本		 17-23&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四部分&lt;/strong&gt;：shell脚本的显示应用	24-25&lt;/p&gt;
&lt;p&gt;pip install &amp;hellip; -i &lt;a class="link" href="https://pypi.tuna.tsinghua.edu.cn/simple" target="_blank" rel="noopener"
 &gt;https://pypi.tuna.tsinghua.edu.cn/simple&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2"&gt;2
&lt;/h3&gt;&lt;p&gt;虚拟控制台：tty(teletypewriter)&lt;/p&gt;
&lt;h3 id="3"&gt;3
&lt;/h3&gt;&lt;h4 id="34"&gt;3.4
&lt;/h4&gt;&lt;p&gt;cd pwd . .. /&lt;/p&gt;
&lt;p&gt;(print working directory)&lt;/p&gt;
&lt;p&gt;当前目录：。&lt;/p&gt;
&lt;p&gt;当前父目录：。。&lt;/p&gt;
&lt;h4 id="35"&gt;3.5
&lt;/h4&gt;&lt;p&gt;ls -aFl&lt;/p&gt;
&lt;p&gt;文件的类型：/ * .&lt;/p&gt;
&lt;p&gt;标准通配符：? * [] !&lt;/p&gt;
&lt;h4 id="36"&gt;3.6
&lt;/h4&gt;&lt;p&gt;创建文件：touch&lt;/p&gt;
&lt;p&gt;复制文件：cp source destination	cp -i	cp -R&lt;/p&gt;
&lt;p&gt;命令行补全：Tab&lt;/p&gt;
&lt;p&gt;链接文件：ln source destination（硬）ln -s f1 f2（软）&lt;/p&gt;
&lt;p&gt;文件移动：mv so de	mv -i&lt;/p&gt;
&lt;p&gt;文件移除(removing)：rm so 	rm -i	rm -f&lt;/p&gt;
&lt;h4 id="37"&gt;3.7
&lt;/h4&gt;&lt;p&gt;创建目录：mkdir	mkdir -p a/b/c	ls -d&lt;/p&gt;
&lt;p&gt;删除目录：rmdir	-i	-r	-f&lt;/p&gt;
&lt;p&gt;转移目录：mv source_dir destination_dir&lt;/p&gt;
&lt;h4 id="38查看文件内容"&gt;3.8：查看文件内容
&lt;/h4&gt;&lt;p&gt;查看文件类型：file&lt;/p&gt;
&lt;p&gt;查看文件：&lt;/p&gt;
&lt;p&gt;​	整个：cat	more	less	-n	-b&lt;/p&gt;
&lt;p&gt;​	部分：tail	head	-n	-f(only tail)&lt;/p&gt;
&lt;h3 id="4更多的shell命令"&gt;4.更多的shell命令
&lt;/h3&gt;&lt;p&gt;Linux系统管理员：&lt;/p&gt;
&lt;p&gt;跟踪运行在系统中的程序（难点：定义究竟到什么程度是高负载），知道何时以及如何结束一个进程（进程间通过信号来通信）&lt;/p&gt;
&lt;p&gt;检测系统磁盘的使用情况&lt;/p&gt;
&lt;p&gt;从日志文件中读取并处理数据&lt;/p&gt;
&lt;h4 id="41监测程序"&gt;4.1监测程序
&lt;/h4&gt;&lt;p&gt;探查进程：&lt;/p&gt;
&lt;p&gt;特定时间点：ps	Unix风格(OSRZT)+GNU风格&lt;/p&gt;
&lt;p&gt;实时：top&lt;/p&gt;
&lt;p&gt;结束进程：&lt;/p&gt;
&lt;p&gt;kill 进程信号	-s&lt;/p&gt;
&lt;p&gt;pkill 程序名（可用通配符）&lt;/p&gt;
&lt;h4 id="42监测磁盘空间"&gt;4.2监测磁盘空间
&lt;/h4&gt;&lt;p&gt;文件系统类型：vfat	ntfs	exfat	iso9660&lt;/p&gt;
&lt;p&gt;挂载存储设备：&lt;/p&gt;
&lt;p&gt;mount -t type device directory&lt;/p&gt;
&lt;p&gt;umount [directory | divece ]&lt;/p&gt;
&lt;p&gt;df	-h&lt;/p&gt;
&lt;p&gt;du&lt;/p&gt;
&lt;h4 id="43处理数据文件"&gt;4.3处理数据文件
&lt;/h4&gt;&lt;p&gt;数据排序：sort	-n	-M	-k	-t	-r&lt;/p&gt;
&lt;p&gt;数据搜索：grep [options] pattern [file]	-vnce&lt;/p&gt;
&lt;p&gt;数据压缩：gzip	gunzip&lt;/p&gt;
&lt;p&gt;数据归档：tar function [options] object1 object2..&lt;/p&gt;
&lt;h3 id="5理解shell"&gt;5理解shell
&lt;/h3&gt;&lt;h4 id="51shell的类型"&gt;5.1shell的类型
&lt;/h4&gt;&lt;p&gt;bash csh tcsh dash &amp;hellip;&lt;/p&gt;
&lt;p&gt;echo $0&lt;/p&gt;
&lt;h4 id="52shell的父子关系"&gt;5.2shell的父子关系
&lt;/h4&gt;&lt;p&gt;命令列表：一行以&amp;quot; ; &amp;ldquo;分隔&lt;/p&gt;
&lt;p&gt;进程列表：一行以&amp;rdquo; ; &amp;ldquo;分隔，整个以&amp;rdquo; () &amp;ldquo;包含	生成子shell执行命令（另一种命令分组，&amp;rdquo; {}; &amp;ldquo;）&lt;/p&gt;
&lt;p&gt;后台模式：command&amp;amp;	将终端与子shell解绑，创建备份文件&lt;/p&gt;
&lt;p&gt;协程{&lt;/p&gt;
&lt;p&gt;同时做：在后台生成一个子shell，在该子shell中执行命令&lt;/p&gt;
&lt;p&gt;coproc command	coproc name { command; }&lt;/p&gt;
&lt;h4 id="53外部命令和内建命令"&gt;5.3外部命令和内建命令
&lt;/h4&gt;&lt;p&gt;外部命令：存在于bash shell之外的程序	衍生：耗费时间和资源来设置新子进程的环境&lt;/p&gt;
&lt;p&gt;内建命令：与shell编译成一体&lt;/p&gt;
&lt;p&gt;type&lt;/p&gt;
&lt;p&gt;pwd	两种都有，/usr/bin/pwd&lt;/p&gt;
&lt;p&gt;history	!!	!number&lt;/p&gt;
&lt;p&gt;别名：alias command=&amp;rsquo;&amp;hellip;&amp;rsquo;	-p&lt;/p&gt;
&lt;h3 id="6linux环境变量"&gt;6Linux环境变量
&lt;/h3&gt;&lt;h4 id="61什么是环境变量62设置用户自定义变量"&gt;6.1什么是环境变量&amp;amp;6.2设置用户自定义变量
&lt;/h4&gt;&lt;p&gt;环境变量：{&lt;/p&gt;
&lt;p&gt;存储shell会话和工作环境的相关信息&lt;/p&gt;
&lt;p&gt;引用环境变量 $var&lt;/p&gt;
&lt;p&gt;全局变量：{&lt;/p&gt;
&lt;p&gt;env	printenv&lt;/p&gt;
&lt;p&gt;​	定义：export 局部变量	export var=value&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;局部变量{&lt;/p&gt;
&lt;p&gt;​	定义：my_variable=value	=两边没有空格&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="63删除环境变量"&gt;6.3删除环境变量
&lt;/h4&gt;&lt;p&gt;删除变量：unset var&lt;/p&gt;
&lt;p&gt;$：用到变量(do anything with)	不加：操作变量(&amp;hellip; to)&lt;/p&gt;
&lt;h4 id="64默认的shell环境变量"&gt;6.4默认的shell环境变量
&lt;/h4&gt;&lt;h4 id="65设置path环境变量"&gt;6.5设置PATH环境变量
&lt;/h4&gt;&lt;p&gt;#!/usr/bin/env bash	更好的可移植性&lt;/p&gt;
&lt;h4 id="66定位系统环境变量"&gt;6.6定位系统环境变量
&lt;/h4&gt;&lt;p&gt;启动bash shell的方式：&lt;/p&gt;
&lt;p&gt;default login shell	登录时作为默认登录shell&lt;/p&gt;
&lt;p&gt;interactive shell 	作为交互式shell，通过生成子shell启动&lt;/p&gt;
&lt;p&gt;non-interactive shell	作为运行脚本的非交互式shell&lt;/p&gt;
&lt;p&gt;默认的主启动文件：/etc/profile	执行特定应用程序启动文件[和管理员自定义启动文件]&lt;/p&gt;
&lt;p&gt;其余启动文件：提供用户专属的启动文件来定义该用户所用到的环境变量&lt;/p&gt;
&lt;h4 id="67数组变量"&gt;6.7数组变量
&lt;/h4&gt;&lt;p&gt;mytest=(zero one two three)&lt;/p&gt;
&lt;p&gt;echo ${mytest[index]}	*&lt;/p&gt;
&lt;h3 id="7理解linux文件权限"&gt;7理解Linux文件权限
&lt;/h3&gt;&lt;h4 id="71linux的安全性"&gt;7.1Linux的安全性
&lt;/h4&gt;&lt;p&gt;Linux安全系统的核心：用户账户&lt;/p&gt;
&lt;p&gt;用户权限——&amp;gt;UID——&amp;gt;登录名&lt;/p&gt;
&lt;p&gt;/etc/shadow&lt;/p&gt;
&lt;p&gt;添加新用户：useradd 	-D	/etc/skel&lt;/p&gt;
&lt;p&gt;删除用户：userdel	-r&lt;/p&gt;
&lt;p&gt;修改用户：{&lt;/p&gt;
&lt;p&gt;usermod	passwd	chpasswd&lt;/p&gt;
&lt;p&gt;chage	chfn	chsh&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="72使用linux组"&gt;7.2使用Linux组
&lt;/h4&gt;&lt;p&gt;唯一的GID和组名&lt;/p&gt;
&lt;p&gt;创建新组：groupadd&lt;/p&gt;
&lt;p&gt;修改组：groupmod	-g	-n&lt;/p&gt;
&lt;h4 id="73理解文件权限"&gt;7.3理解文件权限
&lt;/h4&gt;&lt;p&gt;rwx	属主 属组 其他用户&lt;/p&gt;
&lt;p&gt;设置新建文件和目录的默认权限：umask	umask &lt;u&gt;number&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;八进制模式的安全设置	全权限值(full permission)&lt;/p&gt;
&lt;p&gt;文件：666	目录：777	权限值=默认权限值-umask&lt;/p&gt;
&lt;h4 id="74更改安全设置"&gt;7.4更改安全设置
&lt;/h4&gt;&lt;p&gt;修改权限：{&lt;/p&gt;
&lt;p&gt;chmod options mode file&lt;/p&gt;
&lt;p&gt;模式：八进制、符号&lt;/p&gt;
&lt;p&gt;符号模式：[ugoa&amp;hellip;] [+-=] [rwxXstugo&amp;hellip;]&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;改变所属关系：{&lt;/p&gt;
&lt;p&gt;chown	chgrp&lt;/p&gt;
&lt;p&gt;​	chown options owner [ .group ] file&lt;/p&gt;
&lt;p&gt;​	chgrp group file&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="75共享文件"&gt;7.5共享文件
&lt;/h4&gt;&lt;p&gt;3个额外的信息位：SUID、SGID、粘滞位	(八进制位值)&lt;/p&gt;
&lt;p&gt;chmod g+s dir&lt;/p&gt;
&lt;h4 id="76访问控制列表asl"&gt;7.6访问控制列表(ASL)
&lt;/h4&gt;&lt;p&gt;&lt;em&gt;局限性&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ASL：包含多个用户或组的列表和为其分配的权限&lt;/p&gt;
&lt;p&gt;setfacl [options]&lt;/p&gt;
&lt;p&gt;查看ACL：getfacl file&lt;/p&gt;
&lt;p&gt;分配权限：setfacl [options] rule filenames	-m	-x&lt;/p&gt;
&lt;p&gt;&amp;ldquo;+&amp;rdquo;&lt;/p&gt;
&lt;p&gt;ACL继承：d:&lt;/p&gt;
&lt;h3 id="8管理文件系统"&gt;8管理文件系统
&lt;/h3&gt;&lt;h4 id="81探讨linux文件系统"&gt;8.1探讨Linux文件系统
&lt;/h4&gt;&lt;p&gt;ext(extended filesystem)	i节点表&lt;/p&gt;
&lt;p&gt;ext2&lt;/p&gt;
&lt;p&gt;​	先将数据写入存储设备再更新节点表	易丢失数据&lt;/p&gt;
&lt;p&gt;日志文件系统： 临时文件（日志）{&lt;/p&gt;
&lt;p&gt;​	日志文件系统方法—模式：数据、有序、回写&lt;/p&gt;
&lt;p&gt;​	ext3&lt;/p&gt;
&lt;p&gt;​	ext4
​	JFS(journaled file system)&lt;/p&gt;
&lt;p&gt;​	ReiserFS&lt;/p&gt;
&lt;p&gt;​	XFS&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;日志技术：安全性 vs 性能&lt;/p&gt;
&lt;p&gt;卷管理文件系统 ：{&lt;/p&gt;
&lt;p&gt;写时复制(copy-on-wirte, COW)：快照(snapshot)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;从一个或多个磁盘（或磁盘分区）创建的存储池提供了生成&lt;u&gt;虚拟磁盘&lt;/u&gt;（卷）的能力&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;​	ZFS—Btrfs—Stratis&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;存储容量&lt;/strong&gt;：kmgt pezy&lt;/p&gt;
&lt;h4 id="82使用文件系统"&gt;8.2使用文件系统
&lt;/h4&gt;&lt;p&gt;创建分区：{&lt;/p&gt;
&lt;p&gt;工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fdisk&lt;/li&gt;
&lt;li&gt;gdisk&lt;/li&gt;
&lt;li&gt;GNUparted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;硬盘分配设备名称：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SATA驱动器和SCSI驱动器:	/dev/sd&lt;u&gt;x&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;SSD NVMe驱动器：	/dev/nvme&lt;u&gt;N&lt;/u&gt;n&lt;u&gt;#&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;IDE驱动器：	/dev/hd&lt;u&gt;x&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;BIOS(Basic Input/Output System)&lt;/p&gt;
&lt;p&gt;创建文件系统：mkfs &amp;hellip;&lt;/p&gt;
&lt;p&gt;检查和修复文件系统：fsck options filesystem&lt;/p&gt;
&lt;h4 id="83逻辑卷管理"&gt;8.3逻辑卷管理
&lt;/h4&gt;&lt;p&gt;Linux逻辑卷管理器(logical volume manager, LVM)：将了一块硬盘上的分区加入已有的文件系统来动态地添加存储空间&lt;/p&gt;
&lt;p&gt;LVM布局：{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;物理卷(physical volume, PV)：pvcreate&lt;/li&gt;
&lt;li&gt;卷组(volume group, VG)：vgcreate&lt;/li&gt;
&lt;li&gt;逻辑卷(logical volume, LV)：lvcreate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;LVM：{创建和管理LV的交互式实用工具&lt;/p&gt;
&lt;p&gt;​	关键：将额外的存储空间动态添加到LV&lt;/p&gt;
&lt;p&gt;首次创建逻辑卷的步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建物理卷&lt;/li&gt;
&lt;li&gt;创建卷组&lt;/li&gt;
&lt;li&gt;创建逻辑卷&lt;/li&gt;
&lt;li&gt;格式化逻辑卷&lt;/li&gt;
&lt;li&gt;挂载逻辑卷&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="9安装软件"&gt;9安装软件
&lt;/h3&gt;&lt;h4 id="91软件包管理基础"&gt;9.1软件包管理基础
&lt;/h4&gt;&lt;p&gt;软件包管理系统	数据库	记录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux系统已安装的软件包&lt;/li&gt;
&lt;li&gt;每个软件包安装了哪些文件&lt;/li&gt;
&lt;li&gt;每个已安装的软件包的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;软件包存储在仓库(repository)服务器&lt;/p&gt;
&lt;p&gt;软件包存在依赖关系&lt;/p&gt;
&lt;p&gt;软件包管理系统检测工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;dpkg&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rpm&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="92基于debian的系统"&gt;9.2基于Debian的系统
&lt;/h4&gt;&lt;p&gt;核心：dpkg命令	用于安装、更新、删除DEB包文件&lt;/p&gt;
&lt;p&gt;APT(advanced package tool)工具集{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; apt—cache&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; apt—get&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; apt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;apt [options] command&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用apt管理软件包{&lt;/p&gt;
&lt;p&gt;​	apt &amp;ndash;installed list&lt;/p&gt;
&lt;p&gt;​	apt show package_name&lt;/p&gt;
&lt;p&gt;​	dpkg -L package_name&lt;/p&gt;
&lt;p&gt;​	dpkg &amp;ndash;search absolute_file_name&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用apt安装软件包{&lt;/p&gt;
&lt;p&gt;​	apt search package	(&amp;ndash;names-only)&lt;/p&gt;
&lt;p&gt;​	apt install package_name&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用apt升级软件：apt upgrade&lt;/p&gt;
&lt;p&gt;使用apt卸载软件包{&lt;/p&gt;
&lt;p&gt;​	apt remove	删除软件包，保留数据和配置文件&lt;/p&gt;
&lt;p&gt;​	apt purge package_name	全部删除&lt;/p&gt;
&lt;p&gt;​	apt autoremove	删除依赖关系的无用软件包&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;apt仓库{&lt;/p&gt;
&lt;p&gt;​	位置：/etc/apt/sources.list&lt;/p&gt;
&lt;p&gt;​	指定仓库源：deb(or deb-src)adress distribution_name	package_type_list&lt;/p&gt;
&lt;p&gt;​	deb：已编译程序的仓库源&lt;/p&gt;
&lt;p&gt;​	deb-src：源代码的仓库源&lt;/p&gt;
&lt;p&gt;​	address：软件仓库的网址&lt;/p&gt;
&lt;p&gt;​	distribution_name：该软件仓库的发行版的版本名称&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="93基于red-hat的系统"&gt;9.3基于Red Hat的系统
&lt;/h4&gt;&lt;p&gt;前端工具{	基于rpm(命令行工具)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yum&lt;/li&gt;
&lt;li&gt;zypper&lt;/li&gt;
&lt;li&gt;dnf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;h4 id="94使用容器管理软件"&gt;9.4使用容器管理软件
&lt;/h4&gt;&lt;p&gt;应用程序容器(application container)：创建环境，包含应用程序运行所需的全部文件，包括运行时库文件。	在任何Linux系统正常运行&lt;/p&gt;
&lt;p&gt;容器标准：snap、flatpak&lt;/p&gt;
&lt;p&gt;使用snap容器{&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;snap version&lt;/li&gt;
&lt;li&gt;snap list&lt;/li&gt;
&lt;li&gt;snap find app_name&lt;/li&gt;
&lt;li&gt;snap info app_name&lt;/li&gt;
&lt;li&gt;snap install app_name&lt;/li&gt;
&lt;li&gt;snap remove&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用flatpak容器{&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;flatpak list&lt;/li&gt;
&lt;li&gt;flatpak search app_name&lt;/li&gt;
&lt;li&gt;flatpak install app_ID&lt;/li&gt;
&lt;li&gt;flatpak uninstall app_ID&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="95从源代码安装"&gt;9.5从源代码安装
&lt;/h4&gt;&lt;p&gt;tarball：源代码发布的软件包形式&lt;/p&gt;
&lt;h3 id="10文本编辑器"&gt;10文本编辑器
&lt;/h3&gt;&lt;p&gt;vi编辑器：最早之一，最复杂，大量特性&lt;/p&gt;
&lt;p&gt;vim(vi improved)&lt;/p&gt;
&lt;p&gt;检查vim软件包：readlink -f path&lt;/p&gt;
&lt;p&gt;vim基础{&lt;/p&gt;
&lt;p&gt;​	vi program_name&lt;/p&gt;
&lt;p&gt;​	三种操作模式：&lt;/p&gt;
&lt;p&gt;​	命令：按键解释为命令，移动光标{&lt;/p&gt;
&lt;p&gt;​		方向键、hjkl&lt;/p&gt;
&lt;p&gt;​		G、num G、gg&lt;/p&gt;
&lt;p&gt;​	}&lt;/p&gt;
&lt;p&gt;​	插入：按“i”进入，“Esc”退出&lt;/p&gt;
&lt;p&gt;​	Ex：交互式命令行，命令模式中按“：”{&lt;/p&gt;
&lt;p&gt;​	q：未修改数据，退出&lt;/p&gt;
&lt;p&gt;​	q!：放弃所有修改，退出&lt;/p&gt;
&lt;p&gt;​	w filename：重命名&lt;/p&gt;
&lt;p&gt;​	wq：将缓冲区数据保存到文件，退出&lt;/p&gt;
&lt;p&gt;​	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;编辑数据{	命令模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;删除：x	dd	dw	d$	J	内容在寄存器&lt;/li&gt;
&lt;li&gt;撤销：u&lt;/li&gt;
&lt;li&gt;追加：a	A&lt;/li&gt;
&lt;li&gt;替换：r	R&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;复制和粘贴{&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;p：从寄存器取回数据&lt;/li&gt;
&lt;li&gt;复制：y	yw	y$	可视模式：“v”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;查找和替换{&lt;/p&gt;
&lt;p&gt;​	/&lt;em&gt;content&lt;/em&gt;	/Enter&lt;/p&gt;
&lt;p&gt;​	{	Ex模式	替换命令格式：s/old/new/&lt;/p&gt;
&lt;p&gt;​		s/old/new/g：替换当前行所有的&lt;/p&gt;
&lt;p&gt;​		n,ms/old/new/g：替换n—m行之间所有的&lt;/p&gt;
&lt;p&gt;​		%s/old/new/g：替换所有的&lt;/p&gt;
&lt;p&gt;​		%s/old/new/gc：替换所有的，替换时提示&lt;/p&gt;
&lt;p&gt;​	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;nano、Emacs、KDE、GNOME	&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;h3 id="11构建基础脚本"&gt;11构建基础脚本
&lt;/h3&gt;&lt;h4 id="111使用多个命令"&gt;11.1使用多个命令
&lt;/h4&gt;&lt;p&gt;多个命令同一行，分号分隔	命令行最大字符数255&lt;/p&gt;
&lt;h4 id="112创建shell脚本文件"&gt;11.2创建shell脚本文件
&lt;/h4&gt;&lt;p&gt;文件第一行指定shell：#!/bin/bash&lt;/p&gt;
&lt;p&gt;注释：#	不解释#，除了#！&lt;/p&gt;
&lt;p&gt;运行脚本{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将放置shell脚本文件的目录添加到PATH环境变量中&lt;/li&gt;
&lt;li&gt;在命令行中使用绝对路径或相对路径来引用shell脚本文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	&lt;em&gt;权限&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="113显示消息"&gt;11.3显示消息
&lt;/h4&gt;&lt;p&gt;echo	-n&lt;/p&gt;
&lt;h4 id="114使用变量"&gt;11.4使用变量
&lt;/h4&gt;&lt;p&gt;环境变量：用$引用&lt;/p&gt;
&lt;p&gt;\$		${var}	{}可选&lt;/p&gt;
&lt;p&gt;用户自定义变量{&lt;/p&gt;
&lt;p&gt;​	名称：字母、数字、_ 	长度不超过20	区分大小写&lt;/p&gt;
&lt;p&gt;​	赋值：“=”两边无空格	var=value&lt;/p&gt;
&lt;p&gt;​	&amp;lsquo;&amp;rsquo;,&amp;rdquo;&amp;quot;,省略都是字符串&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;命令替换{&lt;/p&gt;
&lt;p&gt;​	&lt;u&gt;从命令输出中提取信息并将其赋给变量&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;​	将命令输出赋给变量：`command`	$(command)	反引号&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="115重定向输入和输出"&gt;11.5重定向输入和输出
&lt;/h4&gt;&lt;p&gt;重定向运算符指向数据流动方向&lt;/p&gt;
&lt;p&gt;输出重定向：command &amp;gt; outputfile	&amp;raquo;追加&lt;/p&gt;
&lt;p&gt;输入重定向{command &amp;lt; inputfile&lt;/p&gt;
&lt;p&gt;wc：统计数据中的文本&lt;/p&gt;
&lt;p&gt;​	内联输入重定向：command &amp;laquo; marker	指定文本标记划分起止&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="116管道"&gt;11.6管道
&lt;/h4&gt;&lt;p&gt;管道连接(piping){command1 | command2&lt;/p&gt;
&lt;p&gt;同时运行两个命令，在系统内部连接，第一个命令产生输出时，立即传给第二个命令。&lt;/p&gt;
&lt;p&gt;串联的数量无限制:command1 | command2 | command3&lt;/p&gt;
&lt;p&gt;常用：ls -al | more&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="117执行数学运算"&gt;11.7执行数学运算
&lt;/h4&gt;&lt;p&gt;{	只支持整数运算&lt;/p&gt;
&lt;p&gt;expr命令：转义字符(\)&lt;/p&gt;
&lt;p&gt;使用方括号：$[operation]&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;浮点数解决方案{	bash计算器bc	（编程语言）&lt;/p&gt;
&lt;p&gt;基本用法&lt;/p&gt;
&lt;p&gt;​	能够识别{&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数字(整数、浮点数)&lt;/li&gt;
&lt;li&gt;变量(简单变量、数组)&lt;/li&gt;
&lt;li&gt;注释(#、/**/)&lt;/li&gt;
&lt;li&gt;表达式&lt;/li&gt;
&lt;li&gt;编程语句&lt;/li&gt;
&lt;li&gt;函数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	scale：控制小数点位数&lt;/p&gt;
&lt;p&gt;​			}&lt;/p&gt;
&lt;p&gt;在脚本中使用bc{&lt;/p&gt;
&lt;p&gt;​	var=$(echo &amp;ldquo;option; expression&amp;rdquo; | bc)&lt;/p&gt;
&lt;p&gt;​	var=$(bc &amp;laquo; EOF&lt;/p&gt;
&lt;p&gt;​	options&lt;/p&gt;
&lt;p&gt;​	statements&lt;/p&gt;
&lt;p&gt;​	expressions&lt;/p&gt;
&lt;p&gt;​	EOF&lt;/p&gt;
&lt;p&gt;​	)&lt;/p&gt;
&lt;p&gt;​			}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="118退出脚本"&gt;11.8退出脚本
&lt;/h4&gt;&lt;p&gt;查看退出状态码：$?	0~255&lt;/p&gt;
&lt;p&gt;​	保存最后一个已执行命令的退出状态码&lt;/p&gt;
&lt;p&gt;exit命令：&lt;/p&gt;
&lt;h4 id="119实战"&gt;11.9实战
&lt;/h4&gt;&lt;p&gt;纪元时间：date -d &amp;ldquo;Jan 1, 2020&amp;rdquo; +%s&lt;/p&gt;
&lt;h3 id="12结构化命令"&gt;12结构化命令
&lt;/h3&gt;&lt;p&gt;结构化命令：根据条件跳过部分命令，改变执行流程&lt;/p&gt;
&lt;h4 id="121使用if-then语句"&gt;12.1使用if-then语句
&lt;/h4&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;if command	退出状态码&lt;/p&gt;
&lt;p&gt;then			是0执行&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;fi&lt;/p&gt;
&lt;h4 id="122if-then-else语句"&gt;12.2if-then-else语句
&lt;/h4&gt;&lt;p&gt;if command&lt;/p&gt;
&lt;p&gt;then&lt;/p&gt;
&lt;p&gt;​ commands&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;​ commands&lt;/p&gt;
&lt;p&gt;fi&lt;/p&gt;
&lt;h4 id="123嵌套if语句"&gt;12.3嵌套if语句
&lt;/h4&gt;&lt;p&gt;if command&lt;/p&gt;
&lt;p&gt;then&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;elif command&lt;/p&gt;
&lt;p&gt;then&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;elif &amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;fi&lt;/p&gt;
&lt;h4 id="124test命令"&gt;12.4test命令
&lt;/h4&gt;&lt;p&gt;格式：test &lt;em&gt;condition&lt;/em&gt;	condition是一系列参数和值&lt;/p&gt;
&lt;p&gt;退出状态码	0：成立	1：不成立&lt;/p&gt;
&lt;p&gt;判断3类条件：	整数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;数值比较：eq	ge	gt	le	lt	ne&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字符串比较：=	！=	&amp;lt;	&amp;gt;	-n	-z&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文件比较：-d -e -f -r -s -w -x -O -G filename	-nt -ot&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;if [ condition ]	注意要空格&lt;/p&gt;
&lt;p&gt;&amp;lt;，&amp;gt;字符串顺序难题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;，&amp;gt;必须转义，和重定向混淆&lt;/li&gt;
&lt;li&gt;&amp;lt;，&amp;gt;顺序和sort命令不同&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文件比较：shell编程中最为强大且用得最多的比较形式&lt;/p&gt;
&lt;h4 id="125复合条件测试"&gt;12.5复合条件测试
&lt;/h4&gt;&lt;p&gt;布尔逻辑：&amp;amp;&amp;amp;	||&lt;/p&gt;
&lt;h4 id="126if-then的高级特性"&gt;12.6if-then的高级特性
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在子shell中执行命令的单括号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于数学表达式的双括号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于高级字符串处理功能的双方括号&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单括号：(command)		创建子shell&lt;/p&gt;
&lt;p&gt;双括号：(( expresion ))	高级数学表达式，不用转义&lt;/p&gt;
&lt;p&gt;双方括号：[[ expression ]]{&lt;/p&gt;
&lt;p&gt;​	模式匹配	bashshell&lt;/p&gt;
&lt;p&gt;​	== !=	右侧被视为通配符&lt;/p&gt;
&lt;p&gt;​	=~		右侧被视为POSIX扩展正则表达式&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="127case命令"&gt;12.7case命令
&lt;/h4&gt;&lt;p&gt;列表格式：&lt;/p&gt;
&lt;p&gt;case variable in&lt;/p&gt;
&lt;p&gt;pattern1 | pattern2) commands1;;&lt;/p&gt;
&lt;p&gt;pattern3) commands2;;&lt;/p&gt;
&lt;p&gt;*) default commands;;&lt;/p&gt;
&lt;p&gt;esac&lt;/p&gt;
&lt;h4 id="128实战"&gt;12.8实战
&lt;/h4&gt;&lt;h3 id="13更多的结构化命令"&gt;13更多的结构化命令
&lt;/h3&gt;&lt;h4 id="131for命令"&gt;13.1for命令
&lt;/h4&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;for var in list&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;读取列表中的值{&lt;/p&gt;
&lt;p&gt;​	for v in a b c d&lt;/p&gt;
&lt;p&gt;​	保留var的值	空白字符分隔&lt;/p&gt;
&lt;p&gt;​	读取复杂值：转义字符、双引号单引号&lt;/p&gt;
&lt;p&gt;​	从变量中读取&lt;/p&gt;
&lt;p&gt;​	从命令中读取：$(cat $file)	file=绝对路径、相对路径或同一个目录下&lt;/p&gt;
&lt;p&gt;​	更改字段分隔符：{&lt;/p&gt;
&lt;p&gt;​		IFS(internal field separator)&lt;/p&gt;
&lt;p&gt;​		IFS=$&amp;rsquo;\n&amp;rsquo;	IFS.OLD=$IFS&lt;/p&gt;
&lt;p&gt;​				}&lt;/p&gt;
&lt;p&gt;​	使用通配符读取目录	file globbing&lt;/p&gt;
&lt;p&gt;​		for file in /home/*&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="132c语言风格的for命令"&gt;13.2C语言风格的for命令
&lt;/h4&gt;&lt;p&gt;格式：&lt;/p&gt;
&lt;p&gt;for ((variable assignment ; condition ; iteration process))&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;for ((a = 1 ; a &amp;lt; 10 ; a++ ))	可空格&lt;/p&gt;
&lt;h4 id="133while命令"&gt;13.3while命令
&lt;/h4&gt;&lt;p&gt;格式：	只要？为0执行，不为0停止&lt;/p&gt;
&lt;p&gt;while test command&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	other commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;使用多个测试命令，只有最后一个决定是否结束&lt;/p&gt;
&lt;h4 id="134until命令"&gt;13.4until命令
&lt;/h4&gt;&lt;p&gt;结束条件和while相反，其他使用相似&lt;/p&gt;
&lt;p&gt;格式：	只要？为0停止，不为0执行&lt;/p&gt;
&lt;p&gt;until test command&lt;/p&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;p&gt;​	other commands&lt;/p&gt;
&lt;p&gt;done&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4 id="135嵌套循环"&gt;13.5嵌套循环
&lt;/h4&gt;&lt;h4 id="136循环处理文件数据"&gt;13.6循环处理文件数据
&lt;/h4&gt;&lt;p&gt;综合：嵌套循环，修改IFS环境变量&lt;/p&gt;
&lt;h4 id="137循环控制"&gt;13.7循环控制
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;break命令	n(1)&lt;/li&gt;
&lt;li&gt;continue命令	n(1)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="138处理循环的输出"&gt;13.8处理循环的输出
&lt;/h4&gt;&lt;p&gt;管道、重定向&lt;/p&gt;
&lt;p&gt;在done命令之后添加处理命令&lt;/p&gt;
&lt;h4 id="139实战"&gt;13.9实战
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;查找可执行文件&lt;/li&gt;
&lt;li&gt;创建多个用户账户{&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​	CSV(comma-separated value, 逗号分隔值)&lt;/p&gt;
&lt;p&gt;​	while read&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h3 id="14处理用户输入"&gt;14处理用户输入
&lt;/h3&gt;&lt;h4 id="141传递参数"&gt;14.1传递参数
&lt;/h4&gt;&lt;p&gt;最基本方法：命令行参数	./test.sh arg1 arg2 &amp;hellip;&lt;/p&gt;
&lt;p&gt;读取参数{&lt;/p&gt;
&lt;p&gt;​	位置参数(positional parameter)接收命令行参数&lt;/p&gt;
&lt;p&gt;​		$0-脚本名，$1-第一个命令，&amp;hellip;，$9，${10},&amp;hellip;&lt;/p&gt;
&lt;p&gt;​	引号	&amp;lsquo;aa bb&amp;rsquo;&lt;/p&gt;
&lt;p&gt;​	读取脚本名	$0	编写包含多种功能或生成日志消息的工具。拥有一个能识别自己的脚本对于追踪脚本问题、系统审计和生成日志信息非常有用。&lt;/p&gt;
&lt;p&gt;​		basename命令&lt;/p&gt;
&lt;p&gt;​	参数测试	[ -n &amp;ldquo;$1&amp;rdquo; ]&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="142特殊参数变量"&gt;14.2特殊参数变量
&lt;/h4&gt;&lt;p&gt;参数统计：$#	${!#}&lt;/p&gt;
&lt;p&gt;获取所有的数据{&lt;/p&gt;
&lt;p&gt;​	$*：一个整体&lt;/p&gt;
&lt;p&gt;​	$@：各个独立单词&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="143移动参数"&gt;14.3移动参数
&lt;/h4&gt;&lt;p&gt;shift命令{	操作命令行参数&lt;/p&gt;
&lt;p&gt;​	shift	[n]&lt;/p&gt;
&lt;p&gt;​	默认将每个位置的变量值向左移动一个位置	$0不变&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="144处理选项"&gt;14.4处理选项
&lt;/h4&gt;&lt;p&gt;选项：在连字符之后出现的单个字母，能够改变命令的行为&lt;/p&gt;
&lt;p&gt;​	长选项：双连字符起始，跟着一个字符串&lt;/p&gt;
&lt;p&gt;查找选项{&lt;/p&gt;
&lt;p&gt;​	处理简单选项：while、case、shift&lt;/p&gt;
&lt;p&gt;​	分离参数和选项：&amp;ndash;	同时选用选项和参数&lt;/p&gt;
&lt;p&gt;​		while、case、shift、break&lt;/p&gt;
&lt;p&gt;​	处理含值的选项：&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;使用getopt命令{&lt;/p&gt;
&lt;p&gt;​	接受一系列任意形式的命令行选项和参数，并自动将其转换成适当的格式。能识别命令行参数，简化解析过程。&lt;/p&gt;
&lt;p&gt;​	格式：getopt &lt;u&gt;optstring&lt;/u&gt; parameters&lt;/p&gt;
&lt;p&gt;​	在optstring中列出在脚本中要用到的每个字母，在每个需要值的后面加&amp;quot;：&amp;quot;&lt;/p&gt;
&lt;p&gt;​	在脚本中使用：set &amp;ndash; $(getopt -q ab:cd &amp;ldquo;$@&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;前者在命令行中选项和参数处理后只生成一个输出，后者能够和已有的shell位置变量配合默契&lt;/p&gt;
&lt;p&gt;使用getopts命令{&lt;/p&gt;
&lt;p&gt;​	每次只处理一个检测到的命令行参数。在处理完所有的参数后，getopts会退出并返回一个大于0的退出状态码。&lt;/p&gt;
&lt;p&gt;​	适用在解析命令行参数的循环中&lt;/p&gt;
&lt;p&gt;​	格式：getopts &lt;u&gt;optstring&lt;/u&gt; variable	:	将当前参数保存在命令行中定义的variable	OPTARG,OPTIND&lt;/p&gt;
&lt;p&gt;}	在所有shell脚本中使用的全功能命令行选项和参数处理工具&lt;/p&gt;
&lt;h4 id="145选项标准化"&gt;14.5选项标准化
&lt;/h4&gt;&lt;h4 id="146获取用户输入"&gt;14.6获取用户输入
&lt;/h4&gt;&lt;p&gt;基本的读取{&lt;/p&gt;
&lt;p&gt;​	read	从标准输入(键盘)或另一个文件描述符中接受输入&lt;/p&gt;
&lt;p&gt;​	格式：read variable	-p	REPLY&lt;/p&gt;
&lt;p&gt;​	read -p &amp;ldquo;helloworld&amp;rdquo; var&lt;/p&gt;
&lt;p&gt;​	超时：-t	-n&lt;/p&gt;
&lt;p&gt;​	无显示读取：-s&lt;/p&gt;
&lt;p&gt;​	从文件中读取：&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="147实战"&gt;14.7实战
&lt;/h4&gt;&lt;p&gt;ping命令：快速测试网络主机是否可用&lt;/p&gt;
&lt;h3 id="15呈现数据"&gt;15呈现数据
&lt;/h3&gt;&lt;p&gt;将脚本的输出重定向到Linux系统的不同位置&lt;/p&gt;
&lt;h4 id="151理解输入和输出"&gt;15.1理解输入和输出
&lt;/h4&gt;&lt;p&gt;文件描述符{&lt;/p&gt;
&lt;p&gt;​	Linux用文件描述符标识每个文件对象&lt;/p&gt;
&lt;p&gt;​	非负整数，唯一会标识会话中打开的文件&lt;/p&gt;
&lt;p&gt;​	标准文件描述符&lt;/p&gt;
&lt;p&gt;文件描述符	缩写	描述&lt;/p&gt;
&lt;p&gt;0			STDIN	 标准输入&lt;/p&gt;
&lt;p&gt;1			STDOUT	标准输出&lt;/p&gt;
&lt;p&gt;2			STDERR	 标准错误&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;STDERR{&lt;/p&gt;
&lt;p&gt;​	默认和OUT指向同一个地方&lt;/p&gt;
&lt;p&gt;​	重定向错误{&lt;/p&gt;
&lt;p&gt;​		只重定向错误：2&amp;gt; file&lt;/p&gt;
&lt;p&gt;​		重定向错误信息和正常输出：&lt;/p&gt;
&lt;p&gt;​			1&amp;gt; file1 2&amp;gt; file2&lt;/p&gt;
&lt;p&gt;​			&amp;amp;&amp;gt; file&lt;/p&gt;
&lt;p&gt;​			}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="152在脚本中重定向输出"&gt;15.2在脚本中重定向输出
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;临时重定向每一行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;永久重定向脚本中的所有命令&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;临时重定向：&amp;gt;&amp;amp;2	./file 2&amp;gt; fileERR&lt;/p&gt;
&lt;p&gt;​	重定向到文件描述符加&amp;amp;&lt;/p&gt;
&lt;p&gt;永久重定向：exec [0,1,2]&amp;gt;file&lt;/p&gt;
&lt;h4 id="153在脚本中重定向输入"&gt;15.3在脚本中重定向输入
&lt;/h4&gt;&lt;p&gt;exec命令将STDIN重定向为文件：exec 0&amp;lt; file&lt;/p&gt;
&lt;h4 id="154创建自己的重定向"&gt;15.4创建自己的重定向
&lt;/h4&gt;&lt;p&gt;替代性文件描述符：3~8&lt;/p&gt;
&lt;p&gt;创建输出文件描述符：exec 3&amp;gt; file	&amp;raquo;追加&lt;/p&gt;
&lt;p&gt;重定向文件描述符{&lt;/p&gt;
&lt;p&gt;​	恢复已重定向的文件描述符&lt;/p&gt;
&lt;p&gt;​	exec 3&amp;gt;&amp;amp;1&lt;/p&gt;
&lt;p&gt;​	exec 1&amp;gt;file&lt;/p&gt;
&lt;p&gt;​	exec 1&amp;gt;&amp;amp;3&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;创建输入文件描述符：exec 6&amp;lt;file&lt;/p&gt;
&lt;p&gt;创建读/写文件描述符：exec 3&amp;lt;&amp;gt; file&lt;/p&gt;
&lt;p&gt;​	任何读/写从文件指针上次的位置开始&lt;/p&gt;
&lt;p&gt;关闭文件描述符：exec 3&amp;gt;&amp;amp;-&lt;/p&gt;
&lt;h4 id="155列出打开的文件描述符"&gt;15.5列出打开的文件描述符
&lt;/h4&gt;&lt;p&gt;lsof命令{	-p	-d&lt;/p&gt;
&lt;p&gt;​	列出整个Linux系统打开的所有文件描述符(包括后台进程、登录用户打开的文件)&lt;/p&gt;
&lt;p&gt;​	$$：当前进程PID&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="156抑制命令输出"&gt;15.6抑制命令输出
&lt;/h4&gt;&lt;p&gt;将STDERR重定向到null文件&lt;/p&gt;
&lt;p&gt;位置：/dev/null&lt;/p&gt;
&lt;p&gt;2&amp;gt; /dev/null&lt;/p&gt;
&lt;p&gt;快速清除文件中的数据：cat /dev/null &amp;gt; file&lt;/p&gt;
&lt;h4 id="157使用临时文件"&gt;15.7使用临时文件
&lt;/h4&gt;&lt;p&gt;/tmp{&lt;/p&gt;
&lt;p&gt;​	专供临时文件使用的特殊目录，存放不需要永久保留的文件&lt;/p&gt;
&lt;p&gt;​	任何用户都有读写权限&lt;/p&gt;
&lt;p&gt;​	mktemp&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;创建本地临时文件{&lt;/p&gt;
&lt;p&gt;​	指定文件名模板，模板包含任意文本字符，在 末尾加6个X&lt;/p&gt;
&lt;p&gt;​	mktemp testing.XXXXXX	输出为文件名&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;在/tmp命令中创建临时文件：-t 返回完整路径名&lt;/p&gt;
&lt;p&gt;创建临时目录：-d&lt;/p&gt;
&lt;h4 id="158记录消息"&gt;15.8记录消息
&lt;/h4&gt;&lt;p&gt;tee命令{	连接管道的T型接头&lt;/p&gt;
&lt;p&gt;​	将来自STDIN的数据同时送往两处：STDOUT,所指定的文件&lt;/p&gt;
&lt;p&gt;​	tee file	-a&lt;/p&gt;
&lt;p&gt;​	配合管道命令：date | tee file&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="159实战"&gt;15.9实战
&lt;/h4&gt;&lt;p&gt;读取CSV格式的数据文件，输出SQL INSERT语句，并将数据插入数据库。&lt;/p&gt;
&lt;h3 id="16脚本控制"&gt;16脚本控制
&lt;/h3&gt;&lt;h4 id="161处理信号"&gt;16.1处理信号
&lt;/h4&gt;&lt;p&gt;Linux系统信号&lt;/p&gt;
&lt;p&gt;信号		值		描述&lt;/p&gt;
&lt;p&gt;1		SIGHUP	挂起(hang up)进程&lt;/p&gt;
&lt;p&gt;2		SIGINT	 中断(interrupt)进程&lt;/p&gt;
&lt;p&gt;3		SIGQUIT	停止(stop)进程&lt;/p&gt;
&lt;p&gt;9		SIGKILL	 无条件终止(terminate)..&lt;/p&gt;
&lt;p&gt;15	 SIGTERM	尽可能终止..&lt;/p&gt;
&lt;p&gt;18	 SIGCONT	继续运行停止的..&lt;/p&gt;
&lt;p&gt;19	 SIGSTOP	无条件停止，但不终止..&lt;/p&gt;
&lt;p&gt;20	 SIGTSTP	停止或暂停(pause)，但不终止..&lt;/p&gt;
&lt;p&gt;产生信号&lt;/p&gt;
&lt;p&gt;键盘组合键&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;中断进程：Ctrl+C	SIGINT发送给当前shell所有进程&lt;/li&gt;
&lt;li&gt;暂停进程：Ctrl+	SIGTSTP&amp;hellip;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​	ps -l	kill -9 &lt;em&gt;PID&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;捕获信号{&lt;/p&gt;
&lt;p&gt;​	trap命令：指定shell脚本需要侦测并拦截的	信号&lt;/p&gt;
&lt;p&gt;​	格式：trap commands signals	空格分隔&lt;/p&gt;
&lt;p&gt;​	trap “” SIGINT&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;捕获脚本退出：trap &amp;ldquo;echo bye..&amp;rdquo; EXIT&lt;/p&gt;
&lt;p&gt;修改或移除信号捕获{&lt;/p&gt;
&lt;p&gt;​	修改：重新使用trap命令&lt;/p&gt;
&lt;p&gt;​	trap -p&lt;/p&gt;
&lt;p&gt;​	移除：trap &amp;ndash; SIGINT	trap - SIGINT&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="162以后台模式运行脚本"&gt;16.2以后台模式运行脚本
&lt;/h4&gt;&lt;p&gt;ps -e	看到运行的多个进程&lt;/p&gt;
&lt;p&gt;在后台模式中，进程运行时不和终端会话的STDIN、STDOUT、STDERR关联&lt;/p&gt;
&lt;p&gt;后台运行脚本{&lt;/p&gt;
&lt;p&gt;​	在脚本名后加&amp;amp;&lt;/p&gt;
&lt;p&gt;​	./file &amp;amp;&lt;/p&gt;
&lt;p&gt;​	[1] 2563	作业号，PID&lt;/p&gt;
&lt;p&gt;​	结束时：[1] + Done		./file&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;运行多个后台作业&lt;/p&gt;
&lt;h4 id="163在非控制台下运行脚本"&gt;16.3在非控制台下运行脚本
&lt;/h4&gt;&lt;p&gt;nohup{	让脚本一直以后台模式运行到结束&lt;/p&gt;
&lt;p&gt;​	阻断发给特定进程的SIGHUP信号&lt;/p&gt;
&lt;p&gt;​	格式：nohup command&lt;/p&gt;
&lt;p&gt;​	将STDOUT、STDERR产生的消息重定向到	nohup.out&lt;/p&gt;
&lt;p&gt;​	注意多个命令运行在同目录&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="164作业控制"&gt;16.4作业控制
&lt;/h4&gt;&lt;p&gt;包括:启动、停止、杀死、恢复作业&lt;/p&gt;
&lt;p&gt;查看作业{&lt;/p&gt;
&lt;p&gt;​	jobs	作业控制中的关键命令，允许用户查看shell当前正在处理的作业&lt;/p&gt;
&lt;p&gt;​	+：默认作业，作业控制命令可省略作业号&lt;/p&gt;
&lt;p&gt;​	-：下一个默认作业&lt;/p&gt;
&lt;p&gt;​	-l	-n -r -s&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;重启已停止的作业{	可将已停止的作业作为后台进程或前台进程重启	前台进程会接管当前使用的终端&lt;/p&gt;
&lt;p&gt;​	bg命令：以后台模式重启&lt;/p&gt;
&lt;p&gt;​	fg命令：以前台模式重启	(foreground)&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="165调整谦让度"&gt;16.5调整谦让度
&lt;/h4&gt;&lt;p&gt;多任务操作系统中，内核负责为每个运行的进程分配CPU时间&lt;/p&gt;
&lt;p&gt;nice value{	调度优先级、谦让度&lt;/p&gt;
&lt;p&gt;​	指内核为进程分配的CPU时间(相对于其他进程)&lt;/p&gt;
&lt;p&gt;​	Linux中，由shell启动的所有进程优先级默认为0&lt;/p&gt;
&lt;p&gt;​	整数值，-20~+19	-20最高优先级	Nice guys finish last.&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;nice命令：启动命令时设置调度优先级	nice -n &lt;em&gt;number&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;renice命令：修改已运行命令的优先级	renice -n &lt;em&gt;number&lt;/em&gt; -p &lt;em&gt;PID&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="166定时运行作业"&gt;16.6定时运行作业
&lt;/h4&gt;&lt;p&gt;在预选时间运行脚本的方法：at命令、cron表、anacron&lt;/p&gt;
&lt;p&gt;使用at命令调度作业{&lt;/p&gt;
&lt;p&gt;​	将作业提交到队列中，指定Linux系统何时运行脚本&lt;/p&gt;
&lt;p&gt;​	atd：at守护进程，在队列中检查待运行的作业&lt;/p&gt;
&lt;p&gt;​	格式：at [-f filename] time&lt;/p&gt;
&lt;p&gt;时间格式	/usr/share/doc/at/timespec&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准小时分钟：10:15&lt;/li&gt;
&lt;li&gt;AM/PM指示符：10:15 PM&lt;/li&gt;
&lt;li&gt;特殊时间：now、noon、midnight、teatime(4pm)&lt;/li&gt;
&lt;li&gt;标准日期：MMDDYY、MM/DD/YY、DD.MM.YY&lt;/li&gt;
&lt;li&gt;文本日期：Jul 4、Dec 25(可加年份)&lt;/li&gt;
&lt;li&gt;时间增量：
&lt;ul&gt;
&lt;li&gt;Now + 25 minutes&lt;/li&gt;
&lt;li&gt;10:15 PM tomorrow&lt;/li&gt;
&lt;li&gt;10:15 + 7 days&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	两个队列：a&lt;del&gt;z、A&lt;/del&gt;Z	-q	(z队列占用较少CPU)&lt;/p&gt;
&lt;p&gt;​	获取作业的输出：用户email地址作为STDOUT、STDERR	-M&lt;/p&gt;
&lt;p&gt;​	列出等待的作业：atq命令&lt;/p&gt;
&lt;p&gt;​	删除作业：atrm 作业号&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;调度需要定期运行的脚本{&lt;/p&gt;
&lt;p&gt;​	cron程序调度需要定期运行的作业 	假定Linux系统7*24小时运行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cron时间表：通过特别的格式指定作业何时运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	 格式：minutepasthour hourofday dayofmonth month dayofweek command&lt;/p&gt;
&lt;p&gt;​		字段：值、取值范围(28-30)、通配符&lt;/p&gt;
&lt;p&gt;​		指定完整路径&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;构建cron时间表：crontab命令	-l	-e&lt;/li&gt;
&lt;li&gt;浏览cron目录：hourly、daily、monthly、weekly	将脚本复制到相应目录&lt;/li&gt;
&lt;li&gt;anacron：只处理cron目录的程序，保证作业一定能运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	时间表格式：period delay identifier command	period以天为单位&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h4 id="167使用新的shell启动脚本"&gt;16.7使用新的shell启动脚本
&lt;/h4&gt;&lt;h4 id="168实战"&gt;16.8实战
&lt;/h4&gt;&lt;p&gt;辅助需要在运行时避免被中断的脚本&lt;/p&gt;
&lt;p&gt;source工具&lt;/p&gt;</description></item><item><title>设计模式</title><link>https://kone.js.cn/p/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>https://kone.js.cn/p/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</guid><description>&lt;img src="https://kone.js.cn/" alt="Featured image of post 设计模式" /&gt;&lt;h2 id="设计模式"&gt;设计模式
&lt;/h2&gt;&lt;p&gt;GOF设计模式&lt;/p&gt;
&lt;p&gt;作用：在变化和稳定中间，寻找隔离点，从而管理变化&lt;/p&gt;
&lt;p&gt;底层思维&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语言构造&lt;/li&gt;
&lt;li&gt;编译转换&lt;/li&gt;
&lt;li&gt;内存模型&lt;/li&gt;
&lt;li&gt;运行时机制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;抽象思维&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;面向对象（封装，继承，多态）&lt;/li&gt;
&lt;li&gt;组件封装&lt;/li&gt;
&lt;li&gt;设计模式&lt;/li&gt;
&lt;li&gt;架构模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="如何解决复杂性变化"&gt;如何解决复杂性	“变化”
&lt;/h6&gt;&lt;p&gt;分解（分而治之）	&lt;strong&gt;抽象&lt;/strong&gt;（重用性）&lt;/p&gt;
&lt;h4 id="软件设计的目标复用"&gt;软件设计的目标：&lt;strong&gt;复用&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;​	管理变化，提高复用&lt;/p&gt;
&lt;p&gt;高内聚松耦合&lt;/p&gt;
&lt;p&gt;对象：有责任的抽象&lt;/p&gt;
&lt;h5 id="面向对象设计原则"&gt;面向对象设计原则
&lt;/h5&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DIP：依赖倒置原则&lt;/strong&gt;(变化依赖于稳定，提出抽象类)
&lt;ul&gt;
&lt;li&gt;高层模块(稳定)和低层模块(变化)依赖于抽象(稳定)&lt;/li&gt;
&lt;li&gt;实现细节(变化)依赖于抽象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OCP：开放封闭原则(增加优于改变)
&lt;ul&gt;
&lt;li&gt;对扩展开放，对更改封闭&lt;/li&gt;
&lt;li&gt;类模块是可扩展的，不可修改&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SRP：单一职责原则
&lt;ul&gt;
&lt;li&gt;一个类仅有一个引起它变化的原因&lt;/li&gt;
&lt;li&gt;变化的方向隐含着类的责任&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LSP：Liskov替换原则
&lt;ul&gt;
&lt;li&gt;子类必须能够替换它们的基类(IS-A)&lt;/li&gt;
&lt;li&gt;进程表达类型抽象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ISP：接口隔离原则
&lt;ul&gt;
&lt;li&gt;接口小而完备&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;对象组合优于类继承
&lt;ul&gt;
&lt;li&gt;类继承：白箱复用；对象组合：黑箱复用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;封装变化点
&lt;ul&gt;
&lt;li&gt;使用封装来创建对象之间的分界层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;针对接口编程优于针对实现编程
&lt;ul&gt;
&lt;li&gt;接口标准化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id="refactoring-to-patterns"&gt;Refactoring to Patterns
&lt;/h6&gt;&lt;h5 id="重构关键技法"&gt;重构关键技法
&lt;/h5&gt;&lt;p&gt;&lt;em&gt;差&lt;/em&gt;			&lt;em&gt;优&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;静态	 	动态&lt;/p&gt;
&lt;p&gt;早绑定		晚绑定&lt;/p&gt;
&lt;p&gt;继承		 组合&lt;/p&gt;
&lt;p&gt;编译时依赖	运行时依赖&lt;/p&gt;
&lt;p&gt;紧耦合		松耦合&lt;/p&gt;
&lt;p&gt;稳定：非虚函数&lt;/p&gt;
&lt;p&gt;变化：(纯)虚函数&lt;/p&gt;
&lt;p&gt;扩展：继承+虚函数(多态)&lt;/p&gt;
&lt;p&gt;设计经验&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设计习语：Design Idioms&lt;/li&gt;
&lt;li&gt;设计模式：Design Patterns&lt;/li&gt;
&lt;li&gt;架构模式：Architectural Patterns&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;分类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;目的&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建型(Creational)&lt;/li&gt;
&lt;li&gt;结构型(Structural)&lt;/li&gt;
&lt;li&gt;行为型(Behavioral)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;范围&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;类模式处理类与子类的静态关系&lt;/li&gt;
&lt;li&gt;对象模式处理对象间的动态关系&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;封装变化角度分类&lt;/p&gt;
&lt;h5 id="组件协作模式"&gt;“组件协作”模式：
&lt;/h5&gt;&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Template Method&lt;/li&gt;
&lt;li&gt;Strategy&lt;/li&gt;
&lt;li&gt;Observer/Event&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="单一职责模式"&gt;“单一职责”模式：
&lt;/h5&gt;&lt;p&gt;继承—&amp;gt;组合&lt;/p&gt;
&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Decorator&lt;/li&gt;
&lt;li&gt;Bridge&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="对象创建模式"&gt;“对象创建”模式：
&lt;/h5&gt;&lt;p&gt;隔离类对象的使用者和具体类型(易变)之间的耦合关系	紧耦合，绕开new&lt;/p&gt;
&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Factory Method&lt;/li&gt;
&lt;li&gt;Abstract Factory&lt;/li&gt;
&lt;li&gt;Prototype&lt;/li&gt;
&lt;li&gt;
&lt;h6 id="builder"&gt;Builder
&lt;/h6&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="对象性能模式"&gt;“对象性能”模式：
&lt;/h5&gt;&lt;p&gt;性能&lt;/p&gt;
&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Singleton&lt;/li&gt;
&lt;li&gt;Flyweight&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="接口隔离模式"&gt;“接口隔离”模式：
&lt;/h5&gt;&lt;p&gt;添加一层间接(稳定)接口&lt;/p&gt;
&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Facade&lt;/li&gt;
&lt;li&gt;Proxy&lt;/li&gt;
&lt;li&gt;Adapter&lt;/li&gt;
&lt;li&gt;
&lt;h6 id="mediator"&gt;Mediator
&lt;/h6&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="状态变化模式"&gt;“状态变化”模式：
&lt;/h5&gt;&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h6 id="memento"&gt;Memento
&lt;/h6&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="数据结构模式"&gt;“数据结构”模式：
&lt;/h5&gt;&lt;p&gt;用接口代替封装的数据结构&lt;/p&gt;
&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Composite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h6 id="iterator"&gt;Iterator
&lt;/h6&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h6 id="chain-of-responsibility"&gt;Chain of Responsibility
&lt;/h6&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="行为变化模式"&gt;“行为变化”模式：
&lt;/h5&gt;&lt;p&gt;解耦组件的行为和组件本身&lt;/p&gt;
&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h6 id="command"&gt;Command
&lt;/h6&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h6 id="visitor"&gt;Visitor
&lt;/h6&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="领域规则模式"&gt;“领域规则”模式：
&lt;/h5&gt;&lt;p&gt;典型模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h6 id="interpreter"&gt;Interpreter
&lt;/h6&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id="template-method"&gt;Template Method
&lt;/h6&gt;&lt;p&gt;动机：稳定的整体结构，各子步骤有很多改变的需求&lt;/p&gt;
&lt;p&gt;定义：定义一个算法的骨架(稳定)，将变化到子类&lt;/p&gt;
&lt;p&gt;早绑定		晚绑定&lt;/p&gt;
&lt;h6 id="strategy"&gt;Strategy
&lt;/h6&gt;&lt;p&gt;动机：对象使用多种的算法，经常改变&lt;/p&gt;
&lt;p&gt;定义：定义一系列的算法，并进行各个封装&lt;/p&gt;
&lt;p&gt;扩展&lt;/p&gt;
&lt;p&gt;动态的思考	时间轴&lt;/p&gt;
&lt;p&gt;结构化：if-else	switch-case&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h6 id="observer"&gt;Observer
&lt;/h6&gt;&lt;p&gt;动机：通知依赖关系&lt;/p&gt;
&lt;p&gt;定义：定义对象间的一种一对多的依赖关系&lt;/p&gt;
&lt;p&gt;松耦合&lt;/p&gt;
&lt;p&gt;基于事件的UI框架，MVC模式&lt;/p&gt;
&lt;h6 id="decorator"&gt;Decorator
&lt;/h6&gt;&lt;p&gt;动机：过度地使用继承来扩展对象的功能&lt;/p&gt;
&lt;p&gt;定义：运行时动态(组合)给一个对象增加一些额外的职责&lt;/p&gt;
&lt;p&gt;消除重复代码，减少子类个数&lt;/p&gt;
&lt;p&gt;同时继承和组合&lt;/p&gt;
&lt;p&gt;解决主体类在多个方向上的扩展功能&lt;/p&gt;
&lt;h6 id="bridge"&gt;Bridge
&lt;/h6&gt;&lt;p&gt;动机：多个维度的变化&lt;/p&gt;
&lt;p&gt;定义：将抽象部分与实现部分分离，使得它们可以独立的变化&lt;/p&gt;
&lt;p&gt;多个非常强的变化维度&lt;/p&gt;
&lt;h6 id="factory-method"&gt;Factory Method
&lt;/h6&gt;&lt;p&gt;动机：创建的对象的具体类型随需求变化而经常变化&lt;/p&gt;
&lt;p&gt;定义：定义一个用于创建对象的接口，让子类决定实例化哪一个类&lt;/p&gt;
&lt;p&gt;目的：解耦&lt;/p&gt;
&lt;p&gt;手段：虚函数&lt;/p&gt;
&lt;h6 id="abstract-factory"&gt;Abstract Factory
&lt;/h6&gt;&lt;p&gt;动机：一系列相互依赖的对象&lt;/p&gt;
&lt;p&gt;定义：提供一个接口&lt;/p&gt;
&lt;h6 id="prototype"&gt;Prototype
&lt;/h6&gt;&lt;p&gt;动机：结构复制的对象&lt;/p&gt;
&lt;p&gt;定义：使用原型实例指定创建对象的种类，通过clone这些原型来创建新的对象&lt;/p&gt;
&lt;h6 id="builder-1"&gt;Builder
&lt;/h6&gt;&lt;p&gt;动机：一个复杂对象&lt;/p&gt;
&lt;p&gt;定义：将一个复杂对象的构建与其表示相分离&lt;/p&gt;
&lt;h6 id="singleton"&gt;Singleton
&lt;/h6&gt;&lt;p&gt;动机：只存在一个实例&lt;/p&gt;
&lt;p&gt;定义：&lt;/p&gt;
&lt;p&gt;并发&lt;/p&gt;
&lt;h6 id="flyweight"&gt;Flyweight
&lt;/h6&gt;&lt;p&gt;动机：存储&lt;/p&gt;
&lt;p&gt;定义：运用共享技术有效地支持大量细粒度的对象&lt;/p&gt;
&lt;p&gt;评估内存开销&lt;/p&gt;
&lt;h6 id="facade"&gt;Facade
&lt;/h6&gt;&lt;p&gt;动机：组件的客户和组件中各种子系统有过多的耦合&lt;/p&gt;
&lt;p&gt;定义：为子系统中的一组接口提供一个一致的界面&lt;/p&gt;
&lt;p&gt;系统间&lt;/p&gt;
&lt;h6 id="proxy"&gt;Proxy
&lt;/h6&gt;&lt;p&gt;动机：分布式，性能，安全&lt;/p&gt;
&lt;p&gt;定义：&lt;/p&gt;
&lt;p&gt;软件系统&lt;/p&gt;
&lt;h6 id="adapter"&gt;Adapter
&lt;/h6&gt;&lt;p&gt;动机：旧对象到新环境&lt;/p&gt;
&lt;p&gt;定义：将一个类的接口转换成另一个接口&lt;/p&gt;
&lt;p&gt;对象适配器&lt;/p&gt;
&lt;p&gt;接口兼容，类库迁移&lt;/p&gt;
&lt;h6 id="mediator-1"&gt;Mediator
&lt;/h6&gt;&lt;p&gt;动机：多个对象互相关联交互，维持复杂的运用关系&lt;/p&gt;
&lt;p&gt;定义：用一个中介对象封装一系列的对象交互&lt;/p&gt;
&lt;p&gt;编译时依赖	运行时依赖&lt;/p&gt;
&lt;p&gt;系统内&lt;/p&gt;
&lt;h6 id="state"&gt;State
&lt;/h6&gt;&lt;p&gt;动机：对象行为随着状态改变&lt;/p&gt;
&lt;p&gt;定义：&lt;/p&gt;
&lt;p&gt;类似Strategy&lt;/p&gt;
&lt;h6 id="memento-1"&gt;Memento
&lt;/h6&gt;&lt;p&gt;动机：程序回溯到对象之前的状态&lt;/p&gt;
&lt;p&gt;定义：不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。&lt;/p&gt;
&lt;p&gt;信息隐藏	序列化&lt;/p&gt;
&lt;h6 id="composite"&gt;Composite
&lt;/h6&gt;&lt;p&gt;动机：过于依赖对象内部实现结构&lt;/p&gt;
&lt;p&gt;定义：将对象组合成树形结构，以表示“结构-整体”的层次结构&lt;/p&gt;
&lt;p&gt;一致性&lt;/p&gt;
&lt;p&gt;将”客户代码与复杂的对象容器结构“解耦&lt;/p&gt;
&lt;h6 id="iterator-1"&gt;Iterator
&lt;/h6&gt;&lt;p&gt;动机：集合对象内部结构&lt;/p&gt;
&lt;p&gt;定义：提供一种方法顺序访问一个聚合对象中的各个元素，不暴露对象的内部表示&lt;/p&gt;
&lt;p&gt;泛型编程&lt;/p&gt;
&lt;h6 id="chain-of-responsibility-1"&gt;Chain of Responsibility
&lt;/h6&gt;&lt;p&gt;动机：让请求的接收者自己在运行时决定处理请求&lt;/p&gt;
&lt;p&gt;定义：使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将对象连成一条链，沿着链传递请求&lt;/p&gt;
&lt;h6 id="command-1"&gt;Command
&lt;/h6&gt;&lt;p&gt;动机：行为请求者与行为实现者的“紧耦合”&lt;/p&gt;
&lt;p&gt;定义：将请求封装为对象&lt;/p&gt;
&lt;h6 id="visitor-1"&gt;Visitor
&lt;/h6&gt;&lt;p&gt;动机：类层次结构需要增加新的行为&lt;/p&gt;
&lt;p&gt;定义：表示一个作业于对象结构中的各元素的操作&lt;/p&gt;
&lt;p&gt;double dispatch&lt;/p&gt;
&lt;p&gt;适用于类层次结构稳定，其中的操作改动频繁&lt;/p&gt;
&lt;h6 id="interpreter-1"&gt;Interpreter
&lt;/h6&gt;&lt;p&gt;动机：类似的结构不断重复出现&lt;/p&gt;
&lt;p&gt;定义：给定一个语言，抽象为语法结构&lt;/p&gt;
&lt;h4 id="经验之谈"&gt;经验之谈
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;不要为模式而模式&lt;/li&gt;
&lt;li&gt;关注抽象类和接口&lt;/li&gt;
&lt;li&gt;理清变化点和稳定点&lt;/li&gt;
&lt;li&gt;审视依赖关系&lt;/li&gt;
&lt;li&gt;要有Framework和Application的区隔思维&lt;/li&gt;
&lt;li&gt;良好的设计是演化的结果&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Dart语言</title><link>https://kone.js.cn/p/dart%E8%AF%AD%E8%A8%80/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate><guid>https://kone.js.cn/p/dart%E8%AF%AD%E8%A8%80/</guid><description>&lt;h1 id="dart"&gt;Dart
&lt;/h1&gt;&lt;h2 id="主函数"&gt;主函数
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="变量"&gt;变量
&lt;/h2&gt;&lt;p&gt;var&lt;/p&gt;
&lt;p&gt;Object, String(?), late, final(const)&lt;/p&gt;
&lt;h2 id="流程控制语句"&gt;流程控制语句
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;21st century&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;1901&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;20th century&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flybyObjects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="函数"&gt;函数
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="类"&gt;类
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Spacecraft&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Read-only non-final property
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;launchYear&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;launchDate&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Constructor, with syntactic sugar for assignment to members.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Initialization code goes here.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Named constructor that forwards to the default one.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlaunched&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Method.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Spacecraft: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Type promotion doesn&amp;#39;t work on getters.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;launchDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;launchDate&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;inDays&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt; &lt;span class="m"&gt;365&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Launched: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;launchYear&lt;/span&gt;&lt;span class="s1"&gt; (&lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="s1"&gt; years ago)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Unlaunched&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 使用类
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;voyager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Voyager I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1977&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;voyager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;voyager3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlaunched&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Voyager III&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;voyager3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="其他"&gt;其他
&lt;/h2&gt;&lt;h3 id="-胖箭头"&gt;=&amp;gt; (胖箭头)
&lt;/h3&gt;&lt;p&gt;简写语法用于仅包含一条语句的函数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;flybyObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;turn&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="注释comments"&gt;注释(comments)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;//&lt;/li&gt;
&lt;li&gt;/* &amp;hellip; */&lt;/li&gt;
&lt;li&gt;///(Documentation)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="枚举"&gt;枚举
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;PlanetType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;terrestrial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ice&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="继承"&gt;继承
&lt;/h3&gt;&lt;p&gt;支持单继承&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Orbiter&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;altitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Orbiter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launchDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;altitude&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="mixin"&gt;Mixin
&lt;/h3&gt;&lt;p&gt;一种在多个类层次结构中重用代码的方法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mixin&lt;/span&gt; &lt;span class="n"&gt;Piloted&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;astronauts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;describeCrew&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Number of astronauts: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;astronauts&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PilotedCraft&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Piloted&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ···
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="接口和抽象类"&gt;接口和抽象类
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MockSpaceship&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Spacecraft&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ···
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Describable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;describeWithEmphasis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;=========&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;=========&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="异步"&gt;异步
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;async&lt;/code&gt; 和 &lt;code&gt;await&lt;/code&gt; 关键字可以让你避免回调地狱 (Callback Hell) 并使你的代码更具可读性。&lt;/p&gt;
&lt;h3 id="异常"&gt;异常
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;describeFlybyObjects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;flybyObjects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flybyObjects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;await&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="s1"&gt;.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;readAsString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Could not describe object: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;flybyObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dart:convert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;package:http/http.dart&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Package&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;latestVersion&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;latestVersion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Package{name: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="s1"&gt;, latestVersion: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;latestVersion&lt;/span&gt;&lt;span class="s1"&gt;, description: &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="s1"&gt;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;httpPackageUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dart.dev&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/f/packages/http.json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;httpPackageResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPackageUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPackageResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Failed to retrieve the http package!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPackageResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;latestVersion&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;description:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>