青少年编程与数学 02_001 GO语言程序设计基础 18课题、标准库
本文介绍了Go语言的标准库,它包括基础数据类型操作、网络编程、文件处理、加密解密、并发编程等功能。
课题摘要
本文介绍了Go语言的标准库,它包括基础数据类型操作、网络编程、文件处理、加密解密、并发编程等功能。重点讲解了math包,提供了数学函数和常量,支持三角函数、指数对数运算、超越函数等。同时,还介绍了strings包的字符串操作功能,regexp包的正则表达式支持,os包的操作系统接口功能,以及image包的基本图像处理功能。最后强调了标准库在编程中的重要性,包括统一性、基础功能支持、高质量与稳定性、降低开发成本和促进生态发展等方面。
一、标准库
在计算机编程中,标准库(Standard Library)是指由编程语言官方维护的一组预编译好的、可以直接在该语言中使用的库函数或模块。标准库是编程语言的核心组成部分,它们提供了对操作系统服务的访问、数据结构、算法、协议实现以及其他实用工具,帮助开发者更加高效地编写代码。
二、Go语言标准库
Go语言的标准库非常庞大,涵盖了从基础数据类型操作到网络编程、文件处理、加密解密、并发编程等多个方面的功能。以下是一些主要的包及其功能:
-
基础数据类型和集合:
math: 提供基本的数学函数。sort: 提供排序功能。reflect: 运行时反射,允许程序在运行时检查变量的类型和值。unsafe: 提供底层类型转换和内存操作。
-
字符串和文本处理:
strings: 提供字符串操作功能。strconv: 提供字符串和基本数据类型之间的转换。text/template: 提供模板处理功能。regexp: 提供正则表达式支持。
-
文件和IO操作:
io: 提供基本接口来读取和写入数据。ioutil: 提供简便的I/O操作,如一次性读取或写入文件。os: 提供操作系统功能的接口,如文件操作和环境变量。bufio: 提供带缓冲的I/O操作。archive/zip: 提供ZIP文件的读写功能。
-
网络编程:
net: 提供网络相关的操作,如TCP/UDP连接。http: 提供HTTP客户端和服务器的实现。encoding/json: 提供JSON的编码和解码功能。encoding/xml: 提供XML的编码和解码功能。
-
并发编程:
sync: 提供互斥锁等并发原语。goroutine: 轻量级线程,用于并发执行。channel: 提供通道,用于在goroutine之间安全地传递数据。
-
加密和安全:
crypto: 提供加密算法,如AES、RSA等。tls: 提供TLS协议的实现。
-
时间日期处理:
time: 提供时间日期的操作和时区处理。
-
测试和调试:
testing: 提供测试框架。debug: 提供调试相关的功能。
-
数据库操作:
database/sql: 提供数据库操作的接口。gopkg.in/mgo.v2: MongoDB的Go语言驱动。
-
图像处理:
image: 提供基本的图像处理功能。image/jpeg: 提供JPEG图像的编码和解码。image/png: 提供PNG图像的编码和解码。
-
系统调用:
syscall: 提供底层的系统调用接口。
-
其他:
flag: 提供命令行参数解析。log: 提供日志记录功能。time/rate: 提供限流器,用于控制事件的发生频率。
这只是Go标准库的一部分,实际上Go的标准库非常丰富,几乎涵盖了所有常见的编程需求。
三、math包
(一)主要功能
Go 语言的标准库 math 包主要用于解决各种基础和高级数学运算问题,它提供了大量数学函数和常量,服务于编程中涉及的数学需求。math 包主要解决的问题包括但不限于以下几个方面:
-
三角函数计算:
- 正弦(Sin)、余弦(Cos)、正切(Tan)、反正弦(Asin)、反余弦(Acos)、反正切(Atan)以及相应的双曲函数。
-
指数和对数运算:
- 自然对数(Log,以 e 为底),常用对数(Log10,以 10 为底),指数函数(Exp),幂运算(Pow),以及针对特定场景优化的 Log1p(用于计算 log(1+x) 避免精度损失)。
-
超越函数:
- 幂运算(如平方根Sqrt)、伽马函数(Gamma)、误差函数(Erf)、互补误差函数(Erfc)以及其他特殊函数如 Bessel 函数(J0, J1 等)。
-
浮点数操作:
- 浮点数的绝对值(Abs)、取整(Floor, Ceil, Trunc)、四舍五入(Round)、分解为分数和指数形式(Frexp 和 Ldexp)、判断是否为无穷大或NaN(IsInf, IsNaN)以及处理浮点数边界问题(如最小非零正浮点数)。
-
几何计算:
- 求直角三角形边长关系(如 Hypot 函数计算欧几里得范数),以及模运算(Mod)。
-
数学常数:
- 提供了常用的数学常数,如圆周率 Pi 和自然对数的底数 e。
-
比较和取值限制:
- 提供了 Min 和 Max 函数来获取两个数之间的较大或较小值。
(二)常量
math.MaxFloat64和math.SmallestNonzeroFloat64分别表示 IEEE-754 浮点数的最大值和最小非零正值。math.Pi表示圆周率 π。math.E表示自然对数的底数 e。
示例代码
fmt.Printf("float64的最大值是:%.f\n", math.MaxFloat64)
fmt.Printf("float64的最小值是:%.f\n", math.SmallestNonzeroFloat64)
fmt.Printf("float32的最大值是:%.f\n", math.MaxFloat32)
fmt.Printf("float32的最小值是:%.f\n", math.SmallestNonzeroFloat32)
fmt.Printf("Int8的最大值是:%d\n", math.MaxInt8)
fmt.Printf("Int8的最小值是:%d\n", math.MinInt8)
fmt.Printf("Uint8的最大值是:%d\n", math.MaxUint8)
fmt.Printf("Int16的最大值是:%d\n", math.MaxInt16)
fmt.Printf("Int16的最小值是:%d\n", math.MinInt16)
fmt.Printf("Uint16的最大值是:%d\n", math.MaxUint16)
fmt.Printf("Int32的最大值是:%d\n", math.MaxInt32)
fmt.Printf("Int32的最小值是:%d\n", math.MinInt32)
fmt.Printf("Uint32的最大值是:%d\n", math.MaxUint32)
fmt.Printf("Int64的最大值是:%d\n", math.MaxInt64)
fmt.Printf("Int64的最小值是:%d\n", math.MinInt64)
fmt.Printf("圆周率默认为:%.200f\n", math.Pi)
运行结果
float64的最大值是:179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
float64的最小值是:0
float32的最大值是:340282346638528859811704183484516925440
float32的最小值是:0
Int8的最大值是:127
Int8的最小值是:-128
Uint8的最大值是:255
Int16的最大值是:32767
Int16的最小值是:-32768
Uint16的最大值是:65535
Int32的最大值是:2147483647
Int32的最小值是:-2147483648
Uint32的最大值是:4294967295
Int64的最大值是:9223372036854775807
Int64的最小值是:-9223372036854775808
圆周率默认为:3.14159265358979311599796346854418516159057617187500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(三)函数
数值运算:
math.Abs(x float64) float64返回x的绝对值。math.Ceil(x float64) float64返回大于或等于x的最小整数。math.Floor(x float64) float64返回小于或等于x的最大整数。math.Pow(x, y float64) float64返回x的y次方。math.Sqrt(x float64) float64返回x的平方根。math.Cbrt(x float64) float64返回x的立方根。
三角函数:
math.Sin(x float64) float64返回x弧度的正弦值。math.Cos(x float64) float64返回x弧度的余弦值。math.Tan(x float64) float64返回x弧度的正切值。- 还有它们的反函数如
math.Asin,math.Acos,math.Atan,以及双角形式如math.Sinh,math.Cosh,math.Tanh等。
对数函数:
math.Log(x float64) float64返回x的自然对数(以e为底)。math.Log10(x float64) float64返回x的以10为底的对数。math.Exp(x float64) float64返回e的x次方。
随机数相关:
虽然 math 包本身不直接提供随机数生成器,但 math/rand 子包提供了生成伪随机数的功能:
rand.Intn(n int) int返回一个在 [0, n) 范围内的随机整数。rand.Float64() float64返回 [0.0, 1.0) 范围内的随机浮点数。
要使用这些函数,你需要导入对应的包:
import (
"fmt"
"math"
)
func main() {
// 示例用法
val := math.Sin(math.Pi / 2)
fmt.Println(val)
}
此外,math 包还包含其他高级数学函数,比如求最大公约数 (GCD)、最小二乘解 (Sqrt)、反正切函数的完整范围版本 (Atan2) 等。通过查阅官方文档可以获得更完整的函数列表和详细说明。
(四)练习一
package main
import (
"fmt"
"math"
)
func main() {
/*
取绝对值,函数签名如下:
func Abs(x float64) float64
*/
fmt.Printf("[-3.14]的绝对值为:[%.2f]\n", math.Abs(-3.14))
/*
取x的y次方,函数签名如下:
func Pow(x, y float64) float64
*/
fmt.Printf("[2]的16次方为:[%.f]\n", math.Pow(2, 16))
/*
取余数,函数签名如下:
func Pow10(n int) float64
*/
fmt.Printf("10的[3]次方为:[%.f]\n", math.Pow10(3))
/*
取x的开平方,函数签名如下:
func Sqrt(x float64) float64
*/
fmt.Printf("[64]的开平方为:[%.f]\n", math.Sqrt(64))
/*
取x的开立方,函数签名如下:
func Cbrt(x float64) float64
*/
fmt.Printf("[27]的开立方为:[%.f]\n", math.Cbrt(27))
/*
向上取整,函数签名如下:
func Ceil(x float64) float64
*/
fmt.Printf("[3.14]向上取整为:[%.f]\n", math.Ceil(3.14))
/*
向下取整,函数签名如下:
func Floor(x float64) float64
*/
fmt.Printf("[8.75]向下取整为:[%.f]\n", math.Floor(8.75))
/*
取余数,函数签名如下:
func Floor(x float64) float64
*/
fmt.Printf("[10/3]的余数为:[%.f]\n", math.Mod(10, 3))
/*
分别取整数和小数部分,函数签名如下:
func Modf(f float64) (int float64, frac float64)
*/
Integer, Decimal := math.Modf(3.14159265358979)
fmt.Printf("[3.14159265358979]的整数部分为:[%.f],小数部分为:[%.14f]\n", Integer, Decimal)
}
(五)练习二
生成随机数。
package main
import (
"fmt"
"math/rand"
"time"
)
func init() {
//以时间作为初始化种子
rand.Seed(time.Now().UnixNano())
}
func main() {
for i := 0; i < 10; i++ {
a := rand.Int()
fmt.Println(a)
}
fmt.Println("------------")
for i := 0; i < 10; i++ {
a := rand.Intn(100)
fmt.Println(a)
}
fmt.Println("------------")
for i := 0; i < 10; i++ {
a := rand.Float32()
fmt.Println(a)
}
}
通过这些函数和常量的支持,math 包使得 Go 程序员能够方便地在程序中进行精确的数学计算和分析,覆盖了大多数实际编程中可能遇到的基础数学需求。同时,math 包也是构建更复杂算法和数学应用的基础模块。
四、strings包
Go语言的strings包提供了用于操作UTF-8编码的字符串的函数。以下是一些常用的strings包中的函数:
-
字符串比较:
Compare(a, b string) int: 比较两个字符串,如果a < b返回-1,a == b返回0,a > b返回1。
-
字符串查找:
Contains(s, substr string) bool: 检查字符串s是否包含子串substr。ContainsAny(s, chars string) bool: 检查字符串s是否包含chars中的任意字符。ContainsRune(s string, r rune) bool: 检查字符串s是否包含rune字符。Index(s, sep string) int: 返回子串sep在字符串s中第一次出现的位置。LastIndex(s, sep string) int: 返回子串sep在字符串s中最后一次出现的位置。IndexByte(s string, c byte) int: 返回字符c在字符串s中第一次出现的位置。IndexRune(s string, r rune) int: 返回rune字符在字符串s中第一次出现的位置。
-
字符串分割:
Split(s, sep string) []string: 使用sep作为分隔符将字符串s分割成多个子串。SplitAfter(s, sep string) []string: 与Split类似,但分隔符之后的内容也会被包含在结果中。SplitN(s, sep string, n int) []string: 限制分割的次数。Fields(s string) []string: 将连续的空白符视为一个分隔符,分割字符串。
-
字符串连接:
Join(a []string, sep string) string: 使用sep作为分隔符将字符串数组a连接成一个字符串。
-
字符串替换:
Replace(s, old, new string, n int) string: 将字符串s中old子串替换为new,最多替换n次。
-
字符串修剪:
Trim(s string, cutset string) string: 去除字符串s两端的cutset中的字符。TrimSpace(s string) string: 去除字符串s两端的空白字符。TrimPrefix(s, prefix string) string: 去除字符串s开头的prefix。TrimSuffix(s, suffix string) string: 去除字符串s结尾的suffix。
-
字符串反转:
Reverse(s string) string: 反转字符串s。
-
字符串转换:
ToLower(s string) string: 将字符串s中的所有字符转换为小写。ToUpper(s string) string: 将字符串s中的所有字符转换为大写。
-
字符串格式化:
Format(s string, a ...interface{}) string: 根据格式s格式化字符串,类似于fmt.Sprintf。
-
其他:
HasPrefix(s, prefix string) bool: 检查字符串s是否以prefix开头。HasSuffix(s, suffix string) bool: 检查字符串s是否以suffix结尾。Map(f func(r rune) rune, s string) string: 对字符串s中的每个字符应用函数f,然后返回修改后的字符串。
strings包中的函数都是针对UTF-8编码的字符串设计的,因此在处理非UTF-8编码的文本时需要注意。此外,Go语言还有一个bytes包,它提供的功能与strings类似,但操作的是字节切片而不是字符串。
五、regexp包
Go语言的regexp包提供了对正则表达式的支持,允许进行复杂的字符串匹配、查找、替换和分割等操作。以下是regexp包中一些关键的函数和类型:
(一)类型和函数
-
Regexp类型:
Regexp是一个正则表达式编译后的类型,用于后续的匹配和查找操作。
-
编译正则表达式:
Compile(pattern string) (*Regexp, error): 编译正则表达式并返回一个Regexp对象,如果编译失败则返回错误。MustCompile(pattern string) *Regexp: 类似于Compile,但如果编译失败则会引发panic。
-
匹配和查找:
FindString(string, string) (string, error): 查找首次匹配的子串。FindStringIndex(string, string) ([]int, error): 查找首次匹配的子串,并返回子串的起始和结束索引。FindStringSubmatch(string, string) ([]string, error): 查找首次匹配的子串,并返回所有捕获组。FindStringSubmatchIndex(string, string) ([]int, error): 查找首次匹配的子串,并返回所有捕获组的索引。FindAllString(string, string, int) ([]string, error): 查找所有匹配的子串。FindAllStringSubmatch(string, string, int) ([][]string, error): 查找所有匹配的子串,并返回所有捕获组。FindAllStringSubmatchIndex(string, string, int) ([][]int, error): 查找所有匹配的子串,并返回所有捕获组的索引。
-
替换:
ReplaceAllString(string, string, string) string: 替换字符串中所有匹配正则表达式的部分。ReplaceAllStringFunc(string, string, func(string) string) string: 替换字符串中所有匹配正则表达式的部分,使用函数指定替换规则。
-
分割:
Split(string, string, int) []string: 使用正则表达式分割字符串。
(二)使用示例
以下是一些使用regexp包的示例:
package main
import (
"fmt"
"regexp"
)
func main() {
// 编译正则表达式
re, err := regexp.Compile(`^\d+`)
if err != nil {
panic(err)
}
// 查找首次匹配的子串
match := re.FindString("123abc", "")
fmt.Println(match) // 输出: "123"
// 查找首次匹配的子串的索引
index := re.FindStringIndex("123abc")
fmt.Println(index) // 输出: [0 3]
// 查找所有匹配的子串
allMatches := re.FindAllString("123abc 456def", -1)
fmt.Println(allMatches) // 输出: ["123" "456"]
// 替换字符串中所有匹配正则表达式的部分
replacement := re.ReplaceAllString("123abc 456def", "XXX")
fmt.Println(replacement) // 输出: "XXXabc XXXdef"
// 使用正则表达式分割字符串
splitted := re.Split("123abc 456def", -1)
fmt.Println(splitted) // 输出: ["abc" "def"]
}
注意事项
- 性能: 正则表达式的性能可能会因表达式的复杂度而有很大差异。复杂的正则表达式可能会导致性能问题。
- 错误处理: 编译正则表达式时可能会失败,需要正确处理错误。
- 捕获组: 使用捕获组可以提取匹配的子串中的特定部分。
- 替换函数:
ReplaceAllStringFunc允许使用函数来动态决定替换的字符串。
regexp包提供了强大的正则表达式功能,可以用于各种复杂的文本处理任务。
六、os包
Go语言的os包提供了操作系统功能的接口,包括文件操作、环境变量访问、进程管理等。以下是os包中一些重要的功能和用法:
(一)文件操作
-
创建文件:
Create(name string) (*File, error): 创建一个新的文件,如果文件已存在则会被截断。
-
打开文件:
Open(name string) (*File, error): 打开一个已存在的文件。
-
打开文件并设置模式:
OpenFile(name string, flag int, perm FileMode) (*File, error): 打开文件,并设置打开模式(如只读、只写、追加等)和文件权限。
-
读取文件:
Stat(name string) (FileInfo, error): 获取文件的状态信息。
-
写入文件:
WriteFile(name string, data []byte, perm FileMode) error: 将数据写入文件。
-
删除文件:
Remove(name string) error: 删除指定的文件。
-
重命名文件:
Rename(oldpath, newpath string) error: 重命名文件。
-
文件属性修改:
Chmod(name string, mode FileMode) error: 更改文件的权限。Chtimes(name string, atime time.Time, mtime time.Time) error: 更改文件的访问和修改时间。
(二)目录操作
-
创建目录:
Mkdir(name string, perm FileMode) error: 创建一个目录。
-
删除目录:
RemoveAll(path string) error: 删除一个目录及其所有子目录和文件。
-
读取目录内容:
ReadDir(name string) ([]FileInfo, error): 读取目录中的文件和子目录。
(三)环境变量
-
获取环境变量:
Getenv(key string) string: 根据键名获取环境变量的值。
-
设置环境变量:
Setenv(key, value string): 设置环境变量。
(四)进程管理
-
启动外部程序:
StartProcess(name, arg ...string) (*Process, error): 启动一个外部程序。
-
执行命令:
Exec(name string, arg ...string) (*Process, error): 执行一个命令。
-
等待进程结束:
Process.Wait() (*WaitStatus, error): 等待进程结束,并获取退出状态。
(五)文件锁
- 创建互斥锁:
Lock(): 锁定文件。Unlock(): 解锁文件。
(六)信号处理
- 处理信号:
Signal: 表示一个操作系统信号。Notify(c chan<- os.Signal, sigs ...Signal): 监听指定的信号。
(七)临时文件和目录
-
创建临时文件:
CreateTemp(dir, pattern string, perm FileMode) (*File, error): 创建一个临时文件。
-
创建临时目录:
MkdirTemp(dir, pattern string) (name string, err error): 创建一个临时目录。
(八)示例代码
package main
import (
"fmt"
"os"
)
func main() {
// 创建文件
file, err := os.Create("hello.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
// 写入文件
_, err = file.WriteString("Hello, World!\n")
if err != nil {
fmt.Println(err)
return
}
// 读取文件
data, err := os.ReadFile("hello.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(data))
// 删除文件
err = os.Remove("hello.txt")
if err != nil {
fmt.Println(err)
return
}
}
os包提供了丰富的操作系统接口,使得Go程序能够与底层操作系统进行交互。在使用os包时,需要注意错误处理和资源管理,确保程序的健壮性和稳定性。
七、image包
Go语言的image包提供了基础的图像处理功能,支持多种图像格式的读取和写入。它包括对图像的基本操作,如缩放、裁剪、旋转等。以下是image包中一些重要的功能和用法:
(一)图像类型
-
Color:
Color接口代表一个颜色值。它有多个实现,如RGBA、NRGBA、Paletted等。
-
Image:
Image接口代表一个图像。它有多个实现,如RGBA、NRGBA、Paletted、Gray等。
-
RGBA:
RGBA类型表示一个非透明的颜色,包含红色、绿色、蓝色和alpha通道。
-
NRGBA:
NRGBA类型表示一个可能透明的颜色,包含红色、绿色、蓝色和alpha通道。
-
Paletted:
Paletted类型表示一个调色板图像,包含一个调色板和每个像素的索引。
-
Gray:
Gray类型表示一个灰度图像。
(二)图像处理函数
-
NewRGBA:
NewRGBA(r Rectangle) *RGBA: 创建一个新的RGBA图像。
-
NewNRGBA:
NewNRGBA(r Rectangle) *NRGBA: 创建一个新的NRGBA图像。
-
NewPaletted:
NewPaletted(r Rectangle, palette color.Palette) *Paletted: 创建一个新的调色板图像。
-
NewGray:
NewGray(r Rectangle) *Gray: 创建一个新的灰度图像。
(三)图像绘制
-
Draw:
Draw(dst Image, r, src image.Image, sp, dp image.Point): 将源图像绘制到目标图像上。
-
DrawMask:
DrawMask(dst Image, r, src, mask image.Image, sp, mp, dp image.Point): 使用掩码将源图像绘制到目标图像上。
-
FillRect:
FillRect(dst *Image, r Rectangle, c Color): 在目标图像上填充一个矩形。
-
Colored rectangles:
DrawRect(dst *Image, r Rectangle, c Color): 在目标图像上绘制一个矩形。
(四)图像转换
- 转换图像类型:
- 可以使用
image包中的函数将一种类型的图像转换为另一种类型的图像。
- 可以使用
(五)图像解码和编码
-
Decode:
Decode(r io.Reader) (Image, error): 从io.Reader中解码图像。
-
Encode:
jpeg.Encode(w io.Writer, m Image, o *Options) error: 编码图像为JPEG格式。png.Encode(w io.Writer, m Image) error: 编码图像为PNG格式。
(六)示例代码
package main
import (
"image"
"image/color"
"image/png"
"os"
)
func main() {
// 创建一个新的RGBA图像
img := image.NewRGBA(image.Rect(0, 0, 100, 100))
// 填充颜色
for y := 0; y < 100; y++ {
for x := 0; x < 100; x++ {
img.Set(x, y, color.RGBA{uint8(x * 256 / 100), uint8(y * 256 / 100), 255, 255})
}
}
// 保存图像
file, err := os.Create("output.png")
if err != nil {
panic(err)
}
defer file.Close()
if err := png.Encode(file, img); err != nil {
panic(err)
}
}
image包提供了基础的图像处理功能,但不支持高级图像处理操作,如图像滤波、形态学操作等。对于这些高级操作,可以使用第三方库,如github.com/disintegration/imaging。
在使用image包时,需要注意图像的边界条件和颜色空间,以确保图像处理的正确性和效率。
小结
标准库在编程语言中的意义非常重要,它具有以下几个核心价值:
-
统一性和兼容性:
- 标准库是由语言官方或者标准化组织制定并维护的,确保了所有遵循该语言规范的编译器或解释器都能提供一致的功能集。
- 开发者可以依赖标准库的功能来编写跨平台、跨编译器兼容的代码,无需担心底层实现细节。
-
基础功能支持:
- 标准库通常包含了一种语言所需的基本功能,如输入/输出操作、字符串处理、数学运算、内存管理和错误处理等,这些都是大部分应用程序都需要的基础组件。
-
高质量与稳定性:
- 标准库经过了充分的设计和严格的测试,确保了其内部函数和类库的正确性和可靠性。
- 官方团队和社区会对标准库持续进行维护和优化,修复潜在的安全问题,提升性能。
-
降低开发成本:
- 开发者不需要重复发明轮子,他们可以直接利用标准库中的功能,减少了开发时间和精力,提高了开发效率。
- 标准库的存在也降低了学习成本,因为开发者可以在文档和社区中找到大量的示例和最佳实践。
-
促进生态发展:
- 标准库是构建生态系统的基础,第三方库通常基于标准库进行开发和扩展,确保与其他库的良好集成。
-
安全性:
- 部分标准库还会提供安全版本的API,避免常见的编程陷阱,比如在C++标准库中有防止缓冲区溢出的字符串处理函数。
总之,标准库是编程语言的核心支柱之一,它既提供了必要的基础设施,也为开发者带来了便利性和一致性,是现代软件开发不可或缺的部分。
这些标准库的一些内容在前面已经用过。这里就是重新整理一下,有个对全貌的认识。后续内容将进一步对标准库的一内知识进行介绍。

被折叠的 条评论
为什么被折叠?



