当前位置: 首页 > news >正文

一文带你完整了解Go语言IO基础库

作者 | 百度小程序团队

导读 introduction

对于刚接触Golang学习的同学,估计比较难掌握的知识点之一就是文件IO处理,光在基础库里会发现 golang除了io包提供文件处理外,os包,http包,embed包都有提供类似的处理,由于Golang的继承表达采用的是隐式的表达, 所以他们之间有什么关系?能否相互转换处理?是非常难一眼看出来的。本文就帮大家完整地梳理一下这些io相关的基础库,希望可以帮到大家。

全文9710字,预计阅读时间10分钟。

01 IO库

首先来看一下golang最基础的IO库,包名为"io", 它包括两大部分功能:

第一部分定义了最基本的流操作接口,包括Writer, Reader, Seeker, Closer这几个以及相关的组合接口。分别表达写入,读取, 偏移读和关闭操作处理。

全局类图以及关系如下,方便大家更直观的理解:

image.png

以下对接口进行了源码摘取并进行中文注释:

/*
Reader 是包装基本 Read 方法的接口。Read 将最多 len(p) 个字节读取到 p 中。它返回读取的字节数 (0 <= n <= len(p)) 以及遇到的任何错误。即使 Read 返回 n < len(p),它也可能在调用期间使用所有 p 作为暂存空间。如果某些数据可用,但不是 len(p) 个字节,则 Read 通常会返回可用数据,而不是等待更多数据。当 Read 在成功读取 n > 0 字节后遇到错误或文件结束条件时,它返回读取的字节数。它可能会从同一调用返回(非零)错误,或从后续调用返回错误(且 n == 0)。这种一般情况的一个实例是,在输入流末尾返回非零字节数的 Reader 可能返回 err == EOF 或 err == nil。下一次读取应返回 0、EOF。在考虑错误 err 之前,调用者应始终处理返回的 n > 0 字节。这样做可以正确处理读取一些字节后发生的 I/O 错误以及允许的 EOF 行为。如果 len(p) == 0,Read 应始终返回 n == 0。如果已知某些错误条件(例如 EOF),则可能会返回非零错误。不鼓励 Read 的实现返回带有 nil 错误的零字节计数,除非 len(p) == 0 时。调用者应将返回 0 和 nil 视为表示没有发生任何事情;特别是它不指示 EOF。
*/
type Writer interface {Write(p []byte) (n int, err error)
}
/*
Writer 是包装基本 Write 方法的接口。Write 将 p 中的 len(p) 个字节写入底层数据流。它返回从 p (0 <= n <= len(p)) 写入的字节数以及遇到的导致写入提前停止的任何错误。如果 Write 返回 n < len(p),则必须返回非零错误。写入不得修改切片数据,即使是暂时的。
*/
type Reader interface {Read(p []byte) (n int, err error)
}
/*
Seeker 是包装基本 Seek 方法的接口。Seek 将下一次读取或写入的偏移量设置为 offset,根据从何处解释:SeekStart表示相对于文件开头, SeekCurrent表示相对于当前偏移量, SeekEnd表示相对于结尾(例如,offset = - 2 指定文件的倒数第二个字节)。Seek 返回相对于文件开头的新偏移量或错误(如果有)。寻找文件开始之前的偏移量是错误的。可以允许寻求任何正偏移量,但如果新偏移量超过底层对象的大小,则后续 I/O 操作的行为取决于实现。
*/
type Seeker interface {Seek(offset int64, whence int) (int64, error)
}
/*
Closer 是包装基本 Close 方法的接口。第一次调用后 Close 的行为未定义。具体的实现可能会记录它们自己的行为。
*/
type Closer interface {Close() error
}

在基本的接口外, io库还提供了一些扩展的读写处理能力的接口定义,以提升更便捷的使用:

  • 读相关的定义包括:ReaderAt, RuneReader, RuneScanner, ByteReader, ByteScanner, ReaderFrom

全局类图以及关系如下, 方便大家更直观的理解:

image.png

以下对接口进行了源码摘取并进行中文注释:

/*
ReaderAt 是包装基本 ReadAt 方法的接口。ReadAt 从底层输入源中的偏移量 off 处开始将 len(p) 个字节读取到 p 中。它返回读取的字节数 (0 <= n <= len(p)) 以及遇到的任何错误。当 ReadAt 返回 n < len(p) 时,它返回一个非零错误,解释为什么没有返回更多字节。在这方面,ReadAt比Read更严格。即使 ReadAt 返回 n < len(p),它也可能在调用期间使用所有 p 作为暂存空间。如果某些数据可用但不是 len(p) 个字节,则 ReadAt 会阻塞,直到所有数据可用或发生错误。在这方面,ReadAt 与 Read 不同。如果 ReadAt 返回的 n = len(p) 字节位于输入源的末尾,则 ReadAt 可能返回 err == EOF 或 err == nil。如果 ReadAt 正在从具有寻道偏移的输入源读取,则 ReadAt 不应影响底层寻道偏移,也不会受其影响。ReadAt 的客户端可以在同一输入源上执行并行 ReadAt 调用。
*/
type ReaderAt interface {ReadAt(p []byte, off int64) (n int, err error)
}
/*
RuneReader 是包装 ReadRune 方法的接口。ReadRune 读取单个编码的 Unicode 字符并返回符文及其大小(以字节为单位)。如果没有可用的字符,则会设置 err。
*/
type RuneReader interface {ReadRune() (r rune, size int, err error)
}
/*
ByteReader 是包装 ReadByte 方法的接口。ReadByte 读取并返回输入中的下一个字节或遇到的任何错误。如果 ReadByte 返回错误,则表示没有消耗输入字节,并且返回的字节值未定义。ReadByte 为逐字节处理提供了高效的接口。未实现 ByteReader 的 Reader可以使用 bufio.NewReader 进行包装以添加此方法。
*/
type ByteReader interface {ReadByte() (byte, error)
}
/*
ReaderFrom 是包装 ReadFrom 方法的接口。ReadFrom 从 r 读取数据,直到 EOF 或出现错误。返回值n是读取的字节数。读取期间遇到的除 EOF 之外的任何错误也会返回。Copy函数使用ReaderFrom (如果可用)。
*/
type ReaderFrom interface {ReadFrom(r Reader) (n int64, err error)
}
  • 写相关的定义包括:WriterAt, WriterTo, StringWriter等

全局类图以及关系如下, 方便大家更直观的理解:

image.png

以下对接口进行了源码摘取并进行中文注释:

/*
WriterAt 是包装基本 WriteAt 方法的接口。WriteAt 将 p 中的 len(p) 个字节写入偏移量为 off 的基础数据流。它返回从 p (0 <= n <= len(p)) 写入的字节数以及遇到的导致写入提前停止的任何错误。如果 WriteAt 返回 n < len(p),则它必须返回非零错误。如果 WriteAt 正在写入具有查找偏移量的目标,则 WriteAt 不应影响底层查找偏移量,也不会受其影响。如果范围不重叠,WriteAt 的客户端可以在同一目标上执行并行 WriteAt 调用。实现不得保留 p。
*/
type WriterAt interface {WriteAt(p []byte, off int64) (n int, err error)
}
/*
WriterTo 是包装 WriteTo 方法的接口。WriteTo 将数据写入 w,直到没有更多数据可写入或发生错误时。返回值n是写入的字节数。写入期间遇到的任何错误也会返回。Copy 函数使用 WriterTo(如果可用)。
*/
type WriterTo interface {WriteTo(w Writer) (n int64, err error)
}
/*
StringWriter 是包装 WriteString 方法的接口。
*/
type StringWriter interface {WriteString(s string) (n int, err error)
}

io库还提供了很实用的工具方法,整理如下:

Copy:

func Copy(dst Writer, src Reader) (written int64, err error)

△注:将副本从 src 复制到 dst,直到 src 达到 EOF 或发生错误。它返回复制的字节数以及复制时遇到的第一个错误(如果有)。
成功的 Copy 返回 err == nil,而不是 err == EOF。因为 Copy 被定义为从 src 读取直到 EOF,所以它不会将 Read 中的 EOF 视为要报告的错误。
如果 src 实现_WriterTo_,则通过调用 src.WriteTo(dst) 实现复制。否则,如果 dst 实现了ReaderFrom,则通过调用 dst.ReadFrom(src) 来实现复制。


CopyBuffer:

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)

△注:CopyBuffer 与 Copy 相同,只是它分阶段遍历提供的缓冲区(如果需要)而不是分配临时缓冲区。如果 buf 为 nil,则分配 1;否则,如果它的长度为零,CopyBuffer 就会出现混乱。
如果 src 实现WriterTo或 dst 实现ReaderFrom,则 buf 将不会用于执行复制。


CopyN:

func CopyN(dst Writer, src Reader, n int64) (written int64, err error)

△注:CopyN 将 n 个字节(或直到出现错误)从 src 复制到 dst。它返回复制的字节数以及复制时遇到的最早错误。返回时,当且仅当 err == nil 时写为 == n。如果 dst 实现ReaderFrom,则使用它来实现副本。


Pipe:

func Pipe() (*PipeReader, *PipeWriter)

△注:Pipe 创建同步内存管道。它可用于将需要io.Reader的代码 与需要io.Writer 的代码连接起来。
管道上的读取和写入是一对一匹配的,除非需要多个读取来消耗单个写入。也就是说,对 PipeWriter 的每次写入都会阻塞,直到满足来自PipeReader的一次或多次读取(完全消耗写入数据)为止。数据直接从Write复制到对应的Read(或Reads);没有内部缓冲。
并行调用 Read 和 Write 或与 Close 一起调用是安全的。对 Read 的并行调用和对 Write 的并行调用也是安全的:各个调用将按顺序进行门控。


ReadAll:

func ReadAll(r Reader) ([]byte, error)

△注:ReadAll 从 r 读取直到出现错误或 EOF,然后返回读取的数据。成功地调用返回 err == nil,而不是 err == EOF。因为 ReadAll 被定义为从 src 读取直到 EOF,所以它不会将 Read 中的 EOF 视为要报告的错误。


ReadAtLeast:

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)

△注:ReadAtLeast 从r读取到buf中,直到读取至少min个字节。它返回复制的字节数,如果读取的字节数较少,则返回错误。仅当未读取任何字节时,错误才为 EOF。如果读取少于 min 字节后发生 EOF,则 ReadAtLeast 返回ErrUnexpectedEOF。如果 min 大于 buf 的长度,则ReadAtLeast 返回ErrShortBuffe。返回时,n >= min 当且仅当 err == nil 时。如果 r 在读取了至少 min 个字节后返回错误,则该错误将被丢弃。


ReadFull:

func ReadFull(r Reader, buf []byte) (n int, err error)

△注:ReadFull 将 r 中的 len(buf) 个字节准确读取到 buf 中。它返回复制的字节数,如果读取的字节数较少,则返回错误。仅当未读取任何字节时,错误才为 EOF。如果在读取部分字节但不是全部字节后发生 EOF,则 ReadFull 返回ErrUnexpectedEOF。返回时,n == len(buf) 当且仅当 err == nil 时。如果 r 在读取至少 len(buf) 个字节后返回错误,则该错误将被丢弃。


WriteString:

func WriteString(w Writer , s string ) (n int , err error)

△注:WriteString 将字符串 s 的内容写入 w,它接受字节切片。如果 w 实现StringWriter,则直接调用 [StringWriter.WriteString] 。否则,[Writer.Write] 只会被调用一次。


文件操作读写示例:

// ReadFileExample 读取文件内容并输出
func ReadFileExample() {// 打开文件,第一个参数是文件路径,第二个参数是文件打开模式file, err := os.Open("example.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close() // 延迟关闭文件,确保文件在函数执行完毕后被关闭// 读取文件内容data := make([]byte, 100) // 读取数据的缓冲区count, err := file.Read(data)if err != nil {fmt.Println("Error:", err)return}// 输出文件内容fmt.Printf("Read %d bytes: %s\n", count, data[:count])
}// WriteFileExample 函数演示如何写入数据到文件中
func WriteFileExample() {// 创建文件,第一个参数是文件路径,如果文件已存在则会被截断清空file, err := os.Create("example.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close() // 延迟关闭文件,确保文件在函数执行完毕后被关闭// 写入数据到文件data := []byte("Hello, world!\n")_, err = file.Write(data)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Data has been written to output.txt")
}

io库的第二部分,定义了一个子包"fs", 定义了文件操作相关的接口,包括 File, FS, DirEntry等。

全局类图以及关系如下, 方便大家更直观的理解:

image.png

以下对接口进行了源码摘取并进行中文注释:

/*
文件提供对单个文件的访问。File 接口是文件所需的最低实现。目录文件还应该实现ReadDirFile。文件可以实现io.ReaderAt或io.Seeker作为优化。
*/
type File interface {Stat() (FileInfo, error)Read([]byte) (int, error)Close() error
}
/*
FileInfo 描述一个文件并由Stat返回。
*/
type FileInfo interface {Name() string        // 文件的基本名称Size() int64         // 常规文件的长度(以字节为单位); 其他系统相关Mode() FileMode      // 文件模式位ModTime() time . Time  // 修改时间IsDir() bool         // Mode().IsDir() 的缩写Sys() any            // 底层数据源(可以返回 nil)}
/*
FS 提供对分层文件系统的访问。FS接口是文件系统所需的最低实现。文件系统可以实现附加接口,例如ReadFileFS,以提供附加或优化的功能。testing/fstest.TestFS可用于测试 FS 实现的正确性。
*/
type FS interface {// Open 打开指定的文件。// // 当 Open 返回错误时,错误类型应为 *PathError // Op 字段设置为“open”,Path 字段设置为 name,// 以及 Err 字段描述问题。// // Open 应拒绝打开不满足// ValidPath(name) 的名称的尝试,返回 *PathError,并将 Err 设置为// ErrInvalid 或 ErrNotExist。Open(name string) (File, error)
}
/*
DirEntry 是从目录读取的条目(使用ReadDir函数或ReadDirFile的 ReadDir 方法)。
*/
type DirEntry interface {// Name 返回条目描述的文件(或子目录)的名称。// 这个名称只是路径的最后一个元素(基本名称),而不是整个路径。// 例如,Name 将返回“hello.go”而不是“home/gopher/hello.go”。Name() string// IsDir 报告条目是否描述目录IsDir() bool// Type 返回条目的类型位。// 类型位是通常 FileMode 位的子集,由 FileMode.Type 方法返回Type() FileMode// Info 返回条目描述的文件或子目录的 FileInfo。// 返回的 FileInfo 可能来自读取原始目录的时间// 或来自调用 Info. //如果自目录读取后文件已被删除或重命名,Info 可能会返回满足errors.Is(err, ErrNotExist) 的错误。// 如果条目表示符号链接,则 Info 报告有关链接本身的信息,// 而不是链接目标的信息。Info() (FileInfo, error)
}

02 OS库

至此io库的部分已经介绍结束,但应该有同学会问, 如何使用这些库,特别是文件操作?那就要是与os库联合使用了。 下面也针对os库进行了整理,并给出了相关的示例,方便大家掌握。

全局类图以及关系如下,方便大家更直观的理解:

image.png

类图上,可以看到os库下也定义了File对象,与fs.File接口一样,有一个Stat方法,但返回值变成了os.FileInfo,但类型是直接使用了fs.FileInfo。

// A FileInfo describes a file and is returned by Stat and Lstat.
type FileInfo = fs.FileInfo// A FileMode represents a file's mode and permission bits.
// The bits have the same definition on all systems, so that
// information about files can be moved from one system
// to another portably. Not all bits apply to all systems.
// The only required bit is ModeDir for directories.
type FileMode = fs.FileMode

以下是最简单的文件操作示例:

  file, err := os.Open("example.txt")if err != nil {fmt.Println("无法打开文件:", err)return}defer file.Close() // 确保在函数退出时关闭文件bs := make([]byte, s.Size())file.Read(bs)// 打印文件内容log.Println(string(bs))

以下是最简单的使用fs.FS操作目录的示例:

  root := "/usr/local/go/bin"fileSystem := os.DirFS(root) // 返回 fs.FS

所以总结来讲, os下的File是一个独立的实现,虽然不是直接实现了fs.File接口,但是操作行为,依赖的操作与fs包下的是完全一致的类型。

03 http包

接下来再来整理一下 http包下的文件相关的定义:

image.png

http包下也定义了,FileSystem与File对象,进行相应的操作处理, 这一块的使用也比较好掌握,参见一下下面的示例。

示例:使用http.FileServer实现静态文件服务发布, 使用了 http.FileSystem

  root := "/local/xxx/static"rootfs := os.DirFS(root) // 返回 fs.FSfsstatic := http.FileServer(http.FS(rootfs))// 设置路由http.Handle("/static/", http.StripPrefix("/static/", fsstatic))

04 embed包

最后再介绍一下 embed包。Golang1.16 版本引入的embed标准库, 支持把外部资源文件或目录直接在编译阶段打进编译包中,实现了应用打包时只需一个可执行包的效果。

embed支持把外部资源以 string, []byte或embed.FS方式使用。下面是几个使用示例:

//go:embed hello.txt
var s string//go:embed hello.txt
var b []byte//go:embed hello.txt
var f embed.FS

这里可以看到 embed也定义了 FS对象,用于FileSystem的操作处理。

image.png

从上面的类图可以看到,embed.FS提供的读取文件内容,打开文件以及读取文件目录的功能。

以下对相关的方法进行了源码摘取并进行中文注释:

/*
Open 打开指定的文件进行读取,并将其作为fs.File返回。当文件不是目录时, 返回的文件实现io.Seeker和io.ReaderAt 。
*/
func (f FS) Open(name string) (fs.File, error)
/*
ReadDir 读取并返回整个命名目录。
*/
func (f FS) ReadDir(name string) ([]fs.DirEntry, error)
/*
ReadFile 读取并返回指定文件的内容。
*/
func (f FS) ReadFile(name string) ([]byte, error)

示例代码:从embed.FS读取文件目录,发布成http静态资源服务

package mainimport ("embed""log""net/http"
)//go:embed static/*
var staticFiles embed.FSfunc main() {// 创建文件服务器fileServer := http.FileServer(http.FS(staticFiles))// 设置路由http.Handle("/static/", http.StripPrefix("/static/", fileServer))// 启动HTTP服务器log.Println("Server started on: http://localhost:8080")log.Fatal(http.ListenAndServe(":8080", nil))
}

05 总结

Go语言的基础库里,针对文件操作这一块,各个包都有自己的File, FS的定义,这给很多刚开始学习的同学带来了不少困惑,个人也是觉得设计上是有改进的空间的。希望上述的整理内容,可以帮助到大家更好的理解Go语言IO库的使用。

——————END——————

参考资料:

[1]. https://pkg.go.dev/io@go1.22.1 官方IO类库

[2]. https://pkg.go.dev/embed@go1.22.1 官方Embed类库

[3]. https://github.com/jhunters/goassist goassist 开源go扩展库,提供了非常多的工具方法封装

推荐阅读:

揭秘百度数仓融合计算引擎

教不会你算我输系列 | 手把手教你HarmonyOS应用开发

千万级高性能长连接Go服务架构实践

相关文章:

一文带你完整了解Go语言IO基础库

作者 | 百度小程序团队 导读 introduction 对于刚接触Golang学习的同学&#xff0c;估计比较难掌握的知识点之一就是文件IO处理&#xff0c;光在基础库里会发现 golang除了io包提供文件处理外&#xff0c;os包&#xff0c;http包&#xff0c;embed包都有提供类似的处理&#xf…...

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…...

Expert Prompting-引导LLM成为杰出专家

ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 如果适当设计提示&#xff0c;对齐的大型语言模型&#xff08;LLM&#xff09;的回答质量可以显著提高。在本文中&#xff0c;我们提出了ExpertPrompting&#xff0c;以激发LLM作为杰出专家回…...

Element-Plus下拉菜单边框去除教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址&#xff1a;RedisInsight | The Best Redis GUI github开源地址&#xff1a;GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…...

PHPCMS v9城市分站插件

PHPCMS自带的有多站点功能&#xff0c;但是用过的朋友都知道&#xff0c;自带的多站点功能有很多的不方便之处&#xff0c;例如站点栏目没法公用&#xff0c;每个站点都需要创建模型、每个站点都需要单独添加内容&#xff0c;还有站点必须静态化。如果你内容很多这些功能当然无…...

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件&#xff0c;挺方便的&#xff0c;但是拓展性不强&#xff0c;所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍&#xff1a;开源的JavaScript库&#xff0c;用于在web上制作交互式地图&#xff0c;允许你使用React组件的方式在应…...

【测试开发学习历程】计算机编程语言

前言&#xff1a; 学习完数据库&#xff0c;我们便要进入到编程语言的内容当中了。 这里先对编程语言写出大致的分类&#xff0c; 在这之后&#xff0c;我们会以Python为重点&#xff0c; 开始测试开发为重点的编程语言学习。 目录 1 计算机编程语言的发展 2 语言的分类…...

动态内存管理-传值调用错题解析

首先我们来看这个错误代码 首先我们看代码逻辑&#xff0c;首先main函数调用test&#xff0c;test接收的是void类型&#xff0c;设置一个指针变量&#xff0c;指向null&#xff0c;传递给get函数&#xff0c;也就是传递一个空指针给getmemory函数&#xff0c;这个函数接收了&a…...

Java特性之设计模式【装饰器模式】

一、装饰器模式 概述 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装 装饰器模式通过将对象包装在装饰器类中&#xff0c;以…...

Leetcode算法题笔记(2)

目录 图论51. 岛屿数量解法一 52. 腐烂的橘子解法一 53. 课程表解法一 54. 实现 Trie (前缀树)解法一 回溯55. 全排列解法一 56. 子集解法一解法二 57. 电话号码的字母组合解法一 58. 组合总和解法一解法二 59. 括号生成解法一解法二 60. 单词搜索解法一 61. 分割回文串解法一 …...

二手车交易网站|基于JSP技术+ Mysql+Java+ B/S结构的二手车交易网站设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…...

lora-scripts 训练IP形象

CodeWithGPU | 能复现才是好算法CodeWithGPU | GitHub AI算法复现社区&#xff0c;能复现才是好算法https://www.codewithgpu.com/i/Akegarasu/lora-scripts/lora-trainstable-diffusion打造自己的lora模型&#xff08;使用lora-scripts&#xff09;-CSDN博客文章浏览阅读1.1k次…...

Acwing 503. 借教室

Problem: 503. 借教室 文章目录 思路解题方法复杂度Code 思路 这是一个二分查找问题。我们需要找到最大的借教室数量&#xff0c;使得每个教室的借用时间不超过其可用时间。我们可以通过二分查找来找到这个最大的借教室数量。 解题方法 我们首先对所有的借教室请求按照结束时间…...

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.1 神经网络概述&#xff08;Neural Network Overview&#xff09;3.2 神经网络的表示&#xff08;Neural Network Representation…...

Linux设备驱动开发 - 三色LED呼吸灯分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 展锐UIS7885呼吸灯介绍呼吸灯调试方法亮蓝灯亮红灯亮绿灯展锐UIS7885呼吸灯DTS配置ump9620 PMIC驱动ump9620中的LED呼吸灯驱动LED的tr…...

开发者的瑞士军刀:DevToys

DevToys&#xff1a; 一站式开发者工具箱&#xff0c;打造高效创意编程体验&#xff0c;让代码生活更加得心应手&#xff01;—— 精选真开源&#xff0c;释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys&#xff1f;这是微软研发的一项免费实用的系统工具套…...

【vue3.0】实现导出的PDF文件内容是红头文件格式

效果图: 编写文件里面的主要内容 <main><div id"report-box"><p>线索描述</p><p class"label"><span>线索发现时间:</span> <span>{{ detailInfoVal?.problem.createdDate }}</span></p><…...

【CSP试题回顾】202012-2-期末预测之最佳阈值(优化)

CSP-202012-2-期末预测之最佳阈值 关键点 1.map的遍历方式 map<int, int>occ0Num, occ1Num; for (auto it thetaSet.begin(); it ! thetaSet.end(); it) {num num occ0Num[*it] - occ1Num[*it];auto nextIt next(it); // 获取下一个迭代器if (num > maxNum &a…...

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…...

FastAPI+React全栈开发02 什么是FARM技术栈

Chapter01 Web Development and the FARM Stack 02 What is the FARM stack and how does it fit together? FastAPIReact全栈开发02 什么是FARM技术栈 It is important to understand that stacks aren’t really special, they are just sets of technologies that cover…...

C#程序结构详解

目录 背景: 一、C#程序的基本组成部分 二、C# Hello World示例 三、程序结构解析 四、编译与执行C#程序 五、总结 背景: 在学习C#编程语言的过程中&#xff0c;了解程序的基本结构是非常重要的。C#程序由多个组成部分构成&#xff0c;每个部分都有其特定的功能和作用。下面…...

linux 清理空间

1. 根目录下执行命令&#xff0c;查看每个目录下文件大小总和 rootvm10-88-88-3 /]# du -h --max-depth1 79M ./tmp 123M ./etc 4.0K ./media 4.0K ./srv 104M ./boot 5.3G ./var 0 ./sys 8.6M ./dev 196G ./usr 4.0K ./mnt 285M ./opt…...

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到typedef这个关键字&#xff0c;这个关键字的作用是给现有的类型取别名&#xff0c;在实际使用过程中往往是将一个复杂的类型名取一个简单的名字&#xff0c;便于我们的使用。就像我们给很熟的人取外号一样&#xff…...

今天聊聊Docker

在数字化时代&#xff0c;软件应用的开发和部署变得越来越复杂。环境配置、依赖管理、版本控制等问题给开发者带来了不小的挑战。而Docker作为一种容器化技术&#xff0c;正以其独特的优势成为解决这些问题的利器。本文将介绍Docker的基本概念、优势以及应用场景&#xff0c;帮…...

【C语言】结构体

个人主页点这里~ 结构体 一、结构体类型的声明1、结构的声明2、结构体变量的创建和初始化3、声明时的特殊情况4、自引用 二、结构体内存对齐1、对齐规则2、存在内存对齐的原因3、修改默认对齐数 三、结构体传参四、结构体实现位段 一、结构体类型的声明 我们在指针终篇中提到过…...

Git基础(24):分支回退

文章目录 前言放弃已修改的内容分支回退到指定commit 前言 将分支回退到之前的某个版本 开发中&#xff0c;可能开发某个功能不需要了&#xff0c;或者想要回退到之前历史的某个commit&#xff0c; 放弃后来修改的内容。 放弃已修改的内容 如果未提交&#xff0c;直接使用 …...

复试专业前沿问题问答合集1

复试专业前沿问题问答合集1 人工智能基础知识问答 Q1: 什么是人工智能(AI)? A1: 人工智能(AI)是计算机科学的一个分支,它涉及创建能够执行通常需要人类智能的任务的机器和软件。这些任务包括学习(获取信息并根据信息对其进行规则化以达到结论)、推理(使用规则达到近…...

C++标准库中提供的用于处理正则表达式的类std::regex

std 是 C 标准库的命名空间&#xff0c;包含了大量标准的 C 类、函数和对象。这些类和函数提供了广泛的功能&#xff0c;包括输入输出、容器、算法、字符串处理等。 通常&#xff0c;为了使用标准库中的对象和函数&#xff0c;需在代码中包含相应的头文件&#xff0c;比如 #in…...

.NET Core 服务实现监控可观测性最佳实践

前言 本次实践主要是介绍 .Net Core 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 系统环境&#xff1a;Kubernetes编程语言&#xff1a;.NET Core ≥ 2.1日志框架&#xff1a;Serilog探针类型&#xff1a;ddtrace 接入方案 准备工作 DataKit 部署 DataK…...