go提高升阶(四) I/O流学习
I/O
官网课程
购买课程找博主推荐
文章目录
- I/O
- 文件信息
- 创建文件、目录
- IO读
- IO写(权限)
- 文件复制
- Seeker接口
- 断点续传
- 遍历文件夹
- bufio
电脑中一切,都是以 二进制流的形式存在的。
jpg:010100000010010101001010101010010101010 编码格式,还原为一个图片展示到计算机显示器
mp4:010100000010010101001010101010010101010
i:input 输入
o:output 输出
文件信息
文本文件
二进制文件
file 类是封装 os 包中的。
封装了文件的信息:FileInfo 、 Read、Write
1、读取文件信息 FileInfo
2、向文件中写入内容 Write
3、读取文件内容 Read
package mainimport ("fmt""os"
)// file
// fileInfo
/*
type FileInfo interface {Name() string // base name of the fileSize() int64 // length in bytes for regular files; system-dependent for othersMode() FileMode // file mode bits : 权限ModTime() time.Time // modification timeIsDir() bool // abbreviation for Mode().IsDir()// 获取更加详细的文件信息, *syscall.Stat_t 反射来获取Sys() any // underlying data source (can return nil)
*/
func main() {// 获取某个文件的状态fileinfo, err := os.Stat("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\test")if err != nil {return}fmt.Println(fileinfo.Name()) // demo01.gofmt.Println(fileinfo.IsDir()) // falsefmt.Println(fileinfo.ModTime()) // 2023-02-23 20:25:43.1772351 +0800 CSTfmt.Println(fileinfo.Size()) // 1186 字节数fmt.Println(fileinfo.Mode()) // -rw-rw-rw-
}
创建文件、目录
通过代码创建文件
路径:
- 相对路径
- 相对当前目录的路径
- ./ 当前目录
- …/ 上一级目录
- 绝对路径
- 从盘符开始的路径
创建目录
mkdir / 权限
mkdirAll 创建层级目录
remove 删除目录
removeAll 强制删除目录
package mainimport ("fmt""os"
)// 创建目录
// 项目开源框架,一运行,就会自动生成脚手架目录
func main() {// 打开一个文件夹(1、存在我就打开 2、不存在,创建这个文件夹)// func Mkdir(name string, perm FileMode) error// ModePerm : 0777err := os.Mkdir("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file1", os.ModePerm)if err != nil {// 存在就无法创建了 Cannot create a file when that file already exists.fmt.Println(err)}fmt.Println("文件夹创建完毕")// 创建层级文件夹err2 := os.MkdirAll("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file2\\aa\\bb\\cc\\dd", os.ModePerm)if err2 != nil {fmt.Println(err2)}fmt.Println("层级文件夹创建完毕")// 删除 remove// func Remove(name string) error// 通过remove方法只能删除单个空文件夹:// remove D:\Environment\GoWorks\src\xuego\lesson11\file2: The directory is not empty.err3 := os.Remove("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file2")if err3 != nil {fmt.Println(err3)//return}fmt.Println("file delete success!!")// 如果存在多层文件,removeAll,相对来说比较危险,删除这个目录下的所有东西, 强制删除err4 := os.RemoveAll("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file2")if err4 != nil {fmt.Println(err4)return}fmt.Println("err4 delete success!!")
}
创建文件
os.create(),若存在就是的打开-就是返回的这个file对象. 如果不存在,创建在打开
package mainimport ("fmt""os"
)func main() {// 创建文件 Create// func Create(name string) (*File, error) {// 返回的file对象就是我们的文件file1, err := os.Create("a.go") // 相对路径if err != nil {fmt.Println(err)}fmt.Println(file1)// 删除os.Remove("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\a.go")}
IO读
1、与文件建立连接
package mainimport ("fmt""os"
)// IO读
func main() {// 找到这个文件的对象 create 创建、 打开Open// func Open(name string) (*File, error)file1, err := os.Open("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\123.txt")if err != nil {fmt.Println(err)}fmt.Println(file1)// file 类-- 指定的对象// 打开文件的时候,选定权限: 可读可写的方式打开// OpenFile(文件名,打开方式:可读、可写...,FileMode , 权限)file2, err2 := os.OpenFile("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\123.txt",os.O_RDONLY|os.O_WRONLY, os.ModePerm)if err2 != nil {fmt.Println(err2)}fmt.Println(file2)// 可以操作这个对象了}
2、读取 file.Read([]byte) ,将file中的数据读取到 []byte 中, n,err n读取到的行数,err 错误,EOF错误,就代表文件读取完毕了
一直调用read,就代表光标往后移动…
package mainimport ("fmt""os"
)// 读取文件数据
func main() {// 我们习惯于在建立连接时候通过defer来关闭连接,保证程序不会出任何问题,或者忘记关闭// 建立连接file, _ := os.Open("123.txt")// 关闭连接defer file.Close()// 读代码 ,Go 的错误机制,让我们专心可以写业务代码。// 1、创建一个容器 (二进制文本文件--0100101010 => 读取流到一个容器 => 读取容器的数据)bs := make([]byte, 2, 1024) // 缓冲区,可以接受我们读取的数据// 2、读取到缓冲区中。 // 汉字一个汉字占 3个位置n, err := file.Read(bs)fmt.Println(n)fmt.Println(err)fmt.Println(string(bs)) // 读取到的字符串 ab// 光标不停的向下去指向,读取出来的内容就存到我们的容器中。file.Read(bs)fmt.Println(string(bs)) // 读取到的字符串 cdfile.Read(bs)fmt.Println(string(bs)) // 读取到的字符串 en, err = file.Read(bs)fmt.Println(n)fmt.Println(err) // EOF ,读取到了文件末尾。就会返回EOF。fmt.Println(string(bs)) // 读取到的字符串n, err = file.Read(bs)fmt.Println(n)fmt.Println(err)fmt.Println(string(bs)) // 读取到的字符串}
IO写(权限)
建立连接 (设置权限:可读可写,扩充这个文件的append) os.OpenFile
关闭连接
写入 file.write
- file.Write
- file.WriteString
package mainimport ("fmt""os"
)func main() {fileName := "123.txt"// 权限:如果我们要向一个文件中追加内容, O_APPEND, 如果没有,就是从头开始写file, _ := os.OpenFile(fileName, os.O_WRONLY|os.O_RDONLY|os.O_APPEND, os.ModePerm)defer file.Close()// 操作bs := []byte{65, 66, 67, 68, 69} // A B C D En, err := file.Write(bs)if err != nil {fmt.Println(err)}fmt.Println(n)// string类型的写入n, err = file.WriteString("hhahahahah哈哈哈哈哈哈哈")if err != nil {fmt.Println(err)}fmt.Println(n)
}
文件复制
package utilsimport ("fmt""io""os"
)// Copy 方法需要参数为:source 源文件 ,destination 目标文件
func Copy(source, destination string, bufferSize int) {// 读取文件sourceFile, err := os.Open(source)if err != nil {fmt.Println("Open错误:", err)}// 输出文件 O_WRONLY , O_CREATE 如果不不存在,则会创建destinationFile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("OpenFile错误:", err)}// 关闭defer sourceFile.Close()defer destinationFile.Close()// 专注业务代码,拷贝buf := make([]byte, bufferSize)// 读取for {n, err := sourceFile.Read(buf)if n == 0 || err == io.EOF {fmt.Println("读取完毕源文件,复制完毕")break} else if err != nil {fmt.Println("读取错误:", err)return // 错误之后,必须要return终止函数执行。}// 将缓冲区的东西写出到目标文件_, err = destinationFile.Write(buf[:n])if err != nil {fmt.Println("写出错误:", err)}}}
调用
package mainimport "xuego/lesson11/utils"func main() {source := "C:\\xq.png"dest := "D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\xq.png"utils.Copy(source, dest, 1024)}
系统给我们提供了copy方法
// 调用系统的方法
func Copy2(source, destination string) {// 读取文件sourceFile, err := os.Open(source)if err != nil {fmt.Println("Open错误:", err)}// 输出文件 O_WRONLY , O_CREATE 如果不不存在,则会创建destinationFile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("OpenFile错误:", err)}// 关闭defer sourceFile.Close()defer destinationFile.Close()// 具体的实现written, err := io.Copy(destinationFile, sourceFile)fmt.Println("文件的字节大小:", written)
}
第三方包,也提供了这些方法。
Seeker接口
设置光标的位置,读写文件
type Seeker interface {// 1、offset 偏移量 3// 2、whence 如何设置,当前光标的位置。Seek(offset int64, whence int) (int64, error)
}
// 如何让光标在第三个位置?
// 1、找到当前光标在哪里
// a) 文件的头部, 0
// b) 文件的尾部 end
// c) 在任意地方,相对位置。const (SeekStart = 0 // 表示相对于文件的开头SeekCurrent = 1 // 表示相对于当前光标所在的位置SeekEnd = 2 // 相对于文件的末尾
)
关于seek的使用
package mainimport ("fmt""io""os"
)func main() {// 读取文件file, _ := os.OpenFile("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\a.txt",os.O_RDWR, os.ModePerm)// defer closedefer file.Close()// 测试seek// 相对开始位置。io.SeekStart// 相对于文件末尾, io.SeekEndfile.Seek(2, io.SeekStart)buf := []byte{0}file.Read(buf)fmt.Println(string(buf))// 相对于当前位置file.Seek(3, io.SeekCurrent)file.Read(buf)fmt.Println(string(buf))// 在结尾追加内容file.Seek(0, io.SeekEnd)file.WriteString("hahahaha")
}
断点续传
思考几个问题:
1、如果你要传的文件很大,70G,是否有方法可以缩短耗时?
- 将文件拆分
- 同时多线程进行下载
2、如果在文件传递过程中,程序被迫中断(断电、断网、内存满了…),下次重启之后,文件是否还需要重头再传?
- 希望能够继续上传或者下载
3、传递文件的时候,支持暂停和恢复上传?假设这个两个操作分布在重启前后?
- 支持!
file、read、write、seek
思路:
1、需要记住上一次传递了多少数据、temp.txt => 记录
2、如果被暂停或者中断了,我们就可以读取这个temp.txt的记录,恢复上传
3、删除temp.txt
理解
package mainimport ("fmt""io""os""strconv"
)// 断点续传
func main() {// 传输源文件地址srcFile := "C:\\Users\\遇见狂神说\\Desktop\\client\\gp.png"// 传输的目标位置destFile := "D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\server\\gp-upload.png"// 临时记录文件tempFile := "D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\temp.txt"// 创建对应的file对象,连接起来file1, _ := os.Open(srcFile)file2, _ := os.OpenFile(destFile, os.O_CREATE|os.O_RDWR, os.ModePerm)file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)defer file1.Close()defer file2.Close()fmt.Println("file1/2/3 文件连接建立完毕")// 1、读取temp.txtfile3.Seek(0, io.SeekStart)buf := make([]byte, 1024, 1024)n, _ := file3.Read(buf)// 2、转换成string - 数字。countStr := string(buf[:n])count, _ := strconv.ParseInt(countStr, 10, 64)fmt.Println("temp.txt中记录的值为:", count) // 5120// 3、设置读写的偏移量file1.Seek(count, io.SeekStart)file2.Seek(count, io.SeekStart)fmt.Println("file1/2 光标已经移动到了目标位置")// 4、开始读写(复制、上传)bufData := make([]byte, 1024, 1024)// 5、需要记录读取了多少个字节total := int(count)for {// 读取数据readNum, err := file1.Read(bufData)if err == io.EOF { // file1 读取完毕了fmt.Println("文件传输完毕了")file3.Close()os.Remove(tempFile)break}// 向目标文件中写入数据writeNum, err := file2.Write(bufData[:readNum])// 将写入数据放到 total中, 在这里total 就是传输的进度total = total + writeNum// temp.txt 存放临时记录数据file3.Seek(0, io.SeekStart) // 将光标重置到开头file3.WriteString(strconv.Itoa(total))}}
遍历文件夹
package mainimport ("fmt""log""os"
)// cd /d 文件夹路径
// tree /F , 查看当前文件夹下的所有文件// 遍历文件夹
// 1、读取当前文件夹下的所有文件
// 2、如果是文件夹,进入文件夹,继续读取里面的所有文件
// 3、设置一些结构化代码
func main() {dir := "D:\\Environment\\GoWorks\\src\\xuego"tree(dir, 0)
}// 日常调试测试常用fmt输出 、 工作中or项目中更多是log日志输出
func tree(dir string, level int) {// 编写层级tabString := "|--"for i := 0; i < level; i++ {tabString = "| " + tabString}// 获取目录 ReadDir, 返回目录信息[]DirEntry,多个文件信息fileInfos, err := os.ReadDir(dir)if err != nil {log.Println(err)}// 遍历出来所有文件之后,获取里面的单个文件for _, file := range fileInfos {// 文件夹中文件的全路径展示filename := dir + "\\" + file.Name()fmt.Println(tabString + file.Name())// 如果是文件夹,再次遍历if file.IsDir() {tree(filename, level+1)}}}
bufio
Go语言自带的IO操作包。bufio,使用这个包可以大幅提升文件的读写效率。
buf: 缓冲区.
io操作效率本身是还可以的,频繁访问本地磁盘文件(效率低)
所以说 bufio ,提供了一个缓冲区,读和写都先在缓冲区中,最后再一次性读取或者写入到文件里,降低访问本地磁盘的次数。
bufio写入
package mainimport ("bufio""fmt""log""os"
)// bufio 的应用
func main() {file, err := os.Open("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\demo01.go")if err != nil {log.Println(err)}defer file.Close()// 读取文件// 创建一个bufio包下的 reader对象。//bufioReader := bufio.NewReader(file)//buf := make([]byte, 1024)//n, err := bufioReader.Read(buf)//fmt.Println("读取到了多少个字节:", n)// 读取键盘的输入// 键盘的输入,实际上是流 os.StdininputReader := bufio.NewReader(os.Stdin)// delim 到哪里结束读取readString, _ := inputReader.ReadString('\n')fmt.Println("读取键盘输入的信息:", readString)}
bufio写出
package mainimport ("bufio""fmt""os"
)// 写入
func main() {file, _ := os.OpenFile("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\a.txt",os.O_RDWR|os.O_CREATE,os.ModePerm)defer file.Close()// bufiofileWrite := bufio.NewWriter(file)writeNum, _ := fileWrite.WriteString("kuangshen")fmt.Println("writeNum:", writeNum)// 发现并没有写出到文件,是留在了缓冲区,所以我们需要调用 flush 刷新缓冲区// 手动刷新进文件fileWrite.Flush()
}
i/o差不多就这些,整理狂神笔记,可以到官网购买课程
官网连接
相关文章:
go提高升阶(四) I/O流学习
I/O 官网课程 购买课程找博主推荐 文章目录I/O文件信息创建文件、目录IO读IO写(权限)文件复制Seeker接口断点续传遍历文件夹bufio电脑中一切,都是以 二进制流的形式存在的。jpg:010100000010010101001010101010010101010 编码格式,还原为一个…...
【代码随想录训练营】【Day28】第七章|回溯算法|93.复原IP地址|78.子集|90.子集II
复原IP地址 题目详细:LeetCode.93 这道题与上一道练习题分割回文字符串十分详细,一样是涉及到分割字符串、判断字符串、递归与回溯的问题,所以这道题要解决的难点在于: 如何分割IP地址字符串如何判断分割的IP地址是否合法递归的…...
Get请求和Post请求区别
前后端交互请求数据的方式有很多种。 例如:Get Post Put Patch Delete Copy 等等很多请求方式 但是用的最多的就是Get和Post Get请求方式 1. get多用于从服务器请求获取数据 2.get传送的数据量较小,不能大于2KB 3.get安全性非常低 Post请求方式 1.…...
static关键字
static的基本基本用法可以分为下面几种: (1)static修饰全局变量 (2) 修饰局部变量 (3)修饰普通函数 (4)修饰类的成员变量 一、static修饰全局变量 当同时编译多个文件时…...
A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance论文总结及翻译
A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance Author: Ryan D. Gow Link: https://ieeexplore.ieee.org/document/4215175/metrics#metrics Select: ⭐️⭐️⭐️⭐️ Type: Academic Journal 备注: CMOS图像传感器噪声性能建模的综合工具 总结 …...
嘀嗒出行再闯IPO:千军万马我无懈
羽扇纶巾笑谈间,千军万马我无懈。 在激烈竞争中再度冲刺港交所IPO的嘀嗒出行,闪露出一丝歌词里的气魄。交通运输部下属网约车监管信息交互系统的数据显示,截至2023年1月31日,全国共有300家网约车平台公司取得网约车平台经营许可。…...
MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)
前言 增强型鲸鱼优化算法(Enhanced Whale Optimization Algorithm,EWOA)是Mohammad H. Nadimi-Shahraki等人于2022年提出的一种改进算法。由于标准的鲸鱼优化算法及其它的改进算法都存在种群多样性低和搜索策略差的问题,因此引入有效的策略来缓解鲸鱼优化算法的这些核心缺点…...
登录Oracle数据库遇到ORA-01017密码错误的解决办法
文章目录症状分析解决办法欢迎加下方我的微信👇,拉你入学习群我们在登录Oracle数据库时可能会遇到ORA-01017错误,这里分析原因并提供解决办法。点击试看博主的专著《MySQL 8.0运维与优化》(清华大学出版社) 症状 图像…...
10个黑客基础教程!简单有效
如果你的电脑运行缓慢,请使用下面介绍的方法来帮助加速、优化和提高电脑的性能。 1.关闭启动时自动运行的应用程序 计算机上安装的许多应用程序都可以将自己配置为在启动期间自动启动并继续在后台运行,但是,如果不是每天都使用这些应用程序…...
JPA之实体之间的关系
JPA之实体之间的关系 10.1.1实体类创建 注解的应用 Table,Entity IdGeneratedValue指定主键,Column P174 实体类编写规范 Table(name "t_user") Entity(name "User") public class User implements Serializable {IdGeneratedVa…...
如何在 C++ 中调用 python 解析器来执行 python 代码(三)?
本文在 C 中调用 multi.py 脚本,并向它传入参数并执行,然后获得返回值并在 C 中打印结果。 目录 如何在 C 中调用 python 解析器来执行 python 代码(一)?如何在 C 中调用 python 解析器来执行 python 代码࿰…...
【Linux】gcc/g++/gdb的使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️社区 : 进步学堂 🛰️欢迎关注:👍点赞🙌收…...
浅浅谈一谈B树和B+树
目录: 🚀1.B树 🚀2.B树 索引背后的数据结构是啥呢,是B树,是为了数据库索引设计的,我们可以先了解B树,再说B树 1.什么是B树 B树也叫B-树,这里的-不读减,是一个符号 我们已经学过了二叉搜素树,B树其实就是N叉搜素树,二叉搜索树只能在每一个结点放一个…...
Keil新建一个国民32位MCU工程
1.打开Keil软件,点击Project→New uVision→Project 2.将工程保存到自己的工程文件夹,并给项目命名,点击保存 3.选择自己需要开发的芯片,点击OK 4.点击OK 5.出现上图所示,工程已经建好了,点击配置工程。 6.…...
webpack.config.js与package.json文件的配置
path要使用绝对路径,通过每次复制文件位置非常麻烦且容易导致问题 使用node中的 写个包名跟入口名称,其他全部回车 此步完成后,自动生成一个package.json包 licence指的是开源,一般不写 安装文件夹需要的依赖 dirname是node自带…...
超详细Eclipse配置JDK
在此附上Eclipse安装教程 超详细Eclipse安装教程 在此附上JDK1.8安装配置教程 超详细JDK1.8安装与配置 ①打开Eclipse–>点击Window–>点击Preferences ②找到Java–>找到Installed JREs–>点击Add… ③选中Standard VM–>之后点击Next ④点击Directory找…...
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares 目录 解决问题 解决思路 解决方法—四大原因分析 T1、数据本身问题的解决方法...
Allegro如何设置铜皮避让的优先级操作指导
Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…...
(Trie Tree)字典树
(Trie Tree)字典树 场景:在n个字符串中查找某个字符串。 暴力匹配,时间复杂度为O(nm),m为字符串平均长度,效率过低。 字典查找单词"fly",首先查找’f’,然后…...
MQTT的学习之Mosquitto集群搭建
文章钢要: 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。 首…...
TS面向对象
第二章:面向对象 面向对象简而言之就是程序之中所有的操作都需要通过对象来完成。 举例来说: 操作浏览器要使用window对象操作网页要使用document对象操作控制台要使用console对象 一切操作都要通过对象,也就是所谓的面向对象,…...
Python进阶-----高阶函数map() 简介和使用
目录 简介: 编辑 示例: 示例(1):输出map()函数返回值(迭代器)结果 示例(2):与循环对比 示例(3):字符串转列表 示…...
GPU会变得更便宜吗?GPU 定价更新
在英伟达和AMD发布了一段时间的一致显卡之后,事情在二月份已经降温。没有新的GPU可以谈论,没有特别惊人的交易或任何东西,但仍然值得看看市场现在的表现如何,因为它已经稳定下来,以及我们在未来几个月可以期待什么。过…...
IDEA如何创建一个springboot项目
要想进入springboot的殿堂,你的跨进springboot的门槛,下面就是使用IDEA初始话一个简单的springboot项目。 选择Create New Project 选择Spring Initializer——>选择对应的jdk版本——>Default默认在线构建,需要联网噢 选择自己想写…...
Netty核心功能以及线程模型
目录 Netty核心功能以及线程模型 Netty初探 Netty的使用场景: Netty通讯示例 Netty线程模型 Netty模块组件 Netty核心功能以及线程模型 Netty初探 NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 So…...
【并发编程二十】协程(coroutine)_协程库
【并发编程二十】协程(coroutine)一、线程的缺点二、协程三、优点四、个人理解五、协程库1、window系统2、unix系统(包括linux的各个版本)2.1、makecontext2.2、swapcontext2.3、setcontext3、第三方库3.1、Boost.Coroutine23.2、…...
c语言入门-5-字符串
c语言入门-5-字符串正文1、字符串怎么用方式一方式二2、字符串的长度深度解析1 字符串的特性2 \0 的含义3 ascii码表下一篇正文 1、字符串怎么用 方式一 // 字符串的标准使用方式,用char类型的数组表示字符串 #include<stdio.h> int main() {char arr[] &…...
[Ansible系列]ansible roles
目录 一. Roles简介 二. Roles基本构成 三. Role使用 3.1 playbook中引用roles 3.2 pre_tasks 和 post_tasks 3.3 role的依赖 四. Ansible Galaxy 一. Roles简介 在Ansible中,role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook…...
冯诺依曼体系结构与操作系统的理解
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:操作系统 💬<3>前言:今天来介绍一下冯诺依曼体系结构,和操作系统的理解。 目录 1.冯诺依曼体系结构 冯诺依曼体系的工作原理: 为…...
API接口签名验证
文章目录一、使用背景二、实现方案三、具体流程四、优化五、代码实现六、后续优化一、使用背景 过去对于接口的验证我一般都是直接在登录时为用户发放token,用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题,如果token被…...
新泰营销型网站建设/郑州seo优化推广
第【734】期早报由【周日】赞助播出01今日头条美国政府正式宣布将重返月球,建立永久性月球基地10月7日消息,据外媒slashgear报道,美国副总统Mike Pence日前在国家太空委员会第一次会议期间宣布,NASA将再次进行载人登月任务并建立永…...
如何用自己的电脑做网站服务器/百度百科官网登录
2009-2019年上市公司数字化转型文本分析词频法仅有计算结果 1、时间:2009-2019年 2、方法:文本分析法,借鉴袁淳等(2021)的做法,基于上市公司“管理层讨论与分析”中数字化相关关键词占比来衡量 3、数字化…...
辽宁平台网站建设平台/百度网盘资源搜索引擎
题目:原题链接(困难) 标签:SQL 解法时间复杂度空间复杂度执行用时Ans 1 (Python)450ms (5.06%)Ans 2 (Python)Ans 3 (Python) 解法一: SELECT T.product_id,P.product_name,T.report_year,T.total_amount FROM (SEL…...
做网站郑州汉狮/上海城市分站seo
Python3中有六种基本数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dict(字典) 他们之前有什么区别?联系?直接上图:按照图示的分类,开始学习吧。(python3) Number(数字类型) Python3 支持 int、float、bool、complex(复数)…...
网络ip查询网站/最新引流推广方法
Bin文件是二进制文件,不能直接阅读。要读取它们,通常需要使用特定的程序或工具,这取决于文件的格式和内容。例如,如果文件是一个可执行文件,可以使用适当的解释器或虚拟机来运行它。如果是一个存储数据的文件ÿ…...
建设婚恋网站/北京seo外包 靠谱
这是一个简单的jQuery代码段,每次加载时都会在您的网页上显示随机引用。 这对于在每次加载网页时显示不同的推荐信很有用,每次都会显示一个新的推荐信。 var a Math.random() "" var rand1 a.charAt(5) quotes new Array quotes[1] "…...