【Golang】关于Go语言中的IO操作

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言中的IO操作
    • 一、os包简介
    • 二、常用函数与示例
      • 1. 文件操作
        • 1.1 获取文件信息
        • 1.2 创建文件
        • 1.3 删除文件
        • 1.4 重命名或移动文件
        • 1.5 打开文件
        • 1.6 读取文件
        • 1.7 IO写
      • 2. 目录操作
        • 2.1 创建目录
        • 2.2 更改当前工作目录
      • 3. 环境变量
        • 3.1 获取环境变量
      • 4. 程序退出
      • 5. 获取系统信息
      • 6. 执行外部命令
        • 1. 执行简单命令
        • 2. 获取命令输出
        • 3. 处理标准输出和标准错误
    • 三、文件复制
      • 1. 自定义的文件复制实现
      • 2. 使用系统自带的io.Copy()方法复制
      • 3. 使用os.ReadFile和os.WriteFile来实现读取写入,从而实现复制
      • 4. io.CopyBuffer() 适合大文件复制

Go语言中的IO操作

在现代软件开发中,高效的输入输出(I/O)操作是提高程序性能的关键之一。Go语言提供了丰富的I/O操作接口,使得文件读写、网络通信等任务变得简单而高效。
Go语言的I/O操作主要通过标准库中的io包和os包实现。o包提供了一系列用于输入和输出操作的基本接口和原语。这些接口和原语构成了Go语言中处理I/O操作的基础,支持多种I/O设备的读写操作,包括文件、网络连接、内存缓冲区等。而os包则提供了对操作系统功能的封装,包括文件操作、进程管理等。

一、os包简介

os包是Go语言标准库中的一个重要包,提供了操作系统相关的功能接口。通过os包,我们可以执行各种底层操作,如读取和写入文件、获取系统信息、执行外部命令等。

二、常用函数与示例

1. 文件操作

1.1 获取文件信息

Stat:获取文件信息对象,符号链接会跳转。
Lstat:获取文件信息对象,符号链接不跳转。

package mainimport ("fmt""os"
)//看下fileinfo接口
// 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() {// 获取某个文件的状态//func Stat(name string) (FileInfo, error)fileinfo, err := os.Stat("F:\\goworks\\src\\jingtian\\yufa\\type别名\\type别名.go")if err != nil {fmt.Println(err)return}fmt.Println(fileinfo.Name())    // 文件名 demo01.gofmt.Println(fileinfo.IsDir())   // 是否目录 falsefmt.Println(fileinfo.ModTime()) // 文件的修改时间 2024-09-26 10:03:01.0946679 +0800 CSTfmt.Println(fileinfo.Size())    // 文件大小 1542 字节数 fmt.Println(fileinfo.Mode())    // 权限 -rw-rw-rw-
}

在这里插入图片描述

1.2 创建文件

Create:创建文件,如果文件存在,则清空原文件。

package mainimport ("fmt""os"
)func main() {//创建文件,文件不存在就创建文件,如果文件存在,则清空原文件。// func Create(name string) (*File, error)file, err := os.Create("example.txt")if err != nil {fmt.Println(err)return}//关闭文件,延迟执行defer file.Close()//向文件中写内容// func (f *File) WriteString(s string) (n int, err error)_, err = file.WriteString("Hello, World!")if err != nil {fmt.Println(err)}fmt.Println("File created successfully")
}

文件创建,并且写入成功
在这里插入图片描述

创建的文件默认权限是0666
在这里插入图片描述

1.3 删除文件

Remove:删除文件或目录(单一文件)只能删除空文件夹,文件不存在会报错。如果文件夹中有文件也删不掉
RemoveAll:递归删除文件或目录,文件或目录不存在不报错,返回nil。
在这里插入图片描述

package mainimport ("fmt""os"
)func main() {// 删除文件// func Remove(name string) error//文件不存在会报错err := os.Remove("example.txt")if err != nil {fmt.Println(err)} else {fmt.Println("File removed successfully")}// 递归删除目录// func RemoveAll(path string) error//目录不存在返回nil 不会报错//可以删除指定目录下的目录或文件err = os.RemoveAll("testdir\\mydir.go")if err != nil {fmt.Println(err)} else {fmt.Println("Directory removed successfully")}
}

在这里插入图片描述

1.4 重命名或移动文件

Rename:重命名文件或移动文件。

package mainimport ("fmt""os"
)func main() {// 重命名文件// func Rename(oldpath, newpath string) errorerr := os.Rename("张三.txt", "新张三.txt")if err != nil {fmt.Println(err)} else {fmt.Println("File renamed successfully")}// 移动文件err = os.Rename("新张三.txt", "testdir\\新张三.txt")if err != nil {fmt.Println(err)} else {fmt.Println("File moved successfully")}
}
1.5 打开文件

使用os.Open函数可以打开一个文件,返回一个*os.File类型的文件对象。如果文件打开失败,会返回一个错误。

package mainimport ("fmt""os"
)func main() {//func Open(name string) (*File, error)file, err := os.Open("example.txt")if err != nil {fmt.Println("Error opening file:", err)return}defer file.Close()fmt.Println("File opened successfully")//打印打开的文件,是个内存地址fmt.Println("Reading file:", file)
}

在这里插入图片描述

打开文件常用方式二:os.OpenFile
在Go语言中,文件的读写操作是使用非常频繁的功能之一。os.OpenFile函数是Go标准库中用于打开文件的强大工具,它允许以多种模式打开文件,并可以设置文件的权限。
os.OpenFile函数简介
os.OpenFile函数用法如下:
func OpenFile(name string, flag int, perm FileMode) (File, error)
name:要打开的文件名或路径。
flag:打开文件的模式,可以是多个标志的按位或组合。常见的标志包括:
os.O_RDONLY:只读模式。
os.O_WRONLY:只写模式。
os.O_RDWR:读写模式。
os.O_APPEND:追加模式,在文件末尾写入数据而不覆盖原有数据。只要有这个参数,就会采用追加模式
os.O_CREATE:如果文件不存在则创建文件。
os.O_EXCL:与O_CREATE一起使用,可执行权限。
os.O_SYNC:同步模式,将文件更改刷新到磁盘。
os.O_TRUNC:截断模式,清空文件内容。
perm:文件权限,表示文件的读写权限,默认为0666(即所有用户都可读写)。
返回值是一个指向打开文件的
File对象和一个可能出现的错误。如果文件打开成功,则可以通过该文件对象进行读取和写入操作。

使用os.OpenFile写文件
以下是一个使用os.OpenFile函数写文件的示例:

package mainimport ("fmt""os"
)func main() {// 以追加、创建、读写模式打开文件file, err := os.OpenFile("./example.txt", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)if err != nil {fmt.Println("打开文件失败:", err)return}defer file.Close() // 确保在函数执行完毕后关闭文件// 写入文件_, err = file.Write([]byte("Hello, Go!\n"))if err != nil {fmt.Println("写入文件失败:", err)return}fmt.Println("文件写入成功")
}

将内容追加到文件中
在这里插入图片描述

1.6 读取文件

使用os.File对象的Read方法可以从文件中读取数据。Read方法会将数据读取到一个字节切片中,并返回读取的字节数和可能发生的错误。
需要借助 file.Read([]byte)读取 ,将file中的数据读取到 []byte 中, n,err n读取到的行数,err 错误,EOF错误,就代表文件读取完毕了

一直调用read,就代表光标往后移动…
以下是一个使用os.Open函数读文件的示例:

package mainimport ("fmt""os"
)// 读取文件数据
func main() {// 我们习惯于在建立连接时候通过defer来关闭连接,保证程序不会出任何问题,或者忘记关闭// 建立连接file, _ := os.Open("example.txt")// 关闭连接defer file.Close()// 读代码 ,Go 的错误机制,让我们专心可以写业务代码。// 1、创建一个容器 (二进制文本文件--0100101010 => 读取流到一个容器 => 读取容器的数据)//一次性读取的内容长度为切片的长度,切片长度为2,容量为1024bs := make([]byte, 2, 1024) // 缓冲区,可以接受我们读取的数据 这里设置的是一次性读取两个字节fmt.Printf("字节切片数据类型%T\n", bs)// 2、读取到缓冲区中。 // 汉字一个汉字占 3个字节// func (f *File) Read(b []byte) (n int, err error) 返回读到的字节数和错误// At end of file, Read returns 0, io.EOF. 读到文件末尾返回0和io.EOFn, err := file.Read(bs)fmt.Println(n)fmt.Println(err)//每次读取光标移动切片的长度,将读取的内容存到切片中。如果读取的文件是文本数据,可以通过string方法将切片中的内容转换为字符串//如果是MP4呀,音乐,图片等文件,就不要用string转换了fmt.Println(string(bs)) // 读取到的字符串  ab//继续往下读// 光标不停的向下去指向,读取出来的内容就存到我们的容器中。file.Read(bs)fmt.Println(string(bs)) // 读取到的字符串  cdfile.Read(bs)fmt.Println(string(bs)) // 读取到的字符串  e//读到文件末尾,得到的n是0,err是EOFn, err = file.Read(bs)fmt.Println(n)fmt.Println(err) // EOF ,读取到了文件末尾。err就会返回EOF。//最后读到了e,将原来切片中的cd的c覆盖了,得到的最终结果是edfmt.Println(string(bs)) // 读取到的字符串}

在这里插入图片描述

1.7 IO写

写的话,要考虑文件的权限问题,大致流程如下
建立连接 (设置权限:可读可写,扩充这个文件的append) os.OpenFile

关闭连接

写入文件常用的方法

  • file.Write

  • file.WriteString

先看下example.txt文件
在这里插入图片描述

package mainimport ("fmt""os"
)func main() {fileName := "example.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 E  ASCII编码// func (f *File) Write(b []byte) (n int, err error)//write方法 写入的是二进制数据字节流,即字节切片n, 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)
}

在这里插入图片描述

再看下example.txt文件,可以看到我们写入的内容全部追加到文件末尾
在这里插入图片描述

如果打开文件的方式不包含os.O_APPEND 则是将源文件覆盖写。os.O_APPEND的意思是,在打开文件时,将光标移动到文件末尾

2. 目录操作

2.1 创建目录

Mkdir:使用指定的权限和名称创建一个目录,目录存在会报错。
MkdirAll:递归创建目录,包括任何必要的上级目录,目录存在不报错。

package mainimport ("fmt""os"
)func main() {// 创建单个目录// func Mkdir(name string, perm FileMode) error// os.ModePerm 是0777的权限//mkidr创建目录,目录存在的情况下,会报错 Cannot create a file when that file already exists.err := os.Mkdir("singledir", os.ModePerm)if err != nil {fmt.Println(err)} else {fmt.Println("Single directory created successfully")}// 递归创建目录,目录存在不报错// func MkdirAll(path string, perm FileMode) errorerr = os.MkdirAll("nested/dirs/test", os.ModePerm)if err != nil {fmt.Println(err)} else {fmt.Println("Nested directories created successfully")}
}
2.2 更改当前工作目录

Getwd:获取当前工作目录。
Chdir:修改当前工作目录。

package mainimport ("fmt""os"
)func main() {// 获取当前工作目录path, err := os.Getwd()if err != nil {fmt.Println(err)return}fmt.Println("Current working directory:", path)// 修改当前工作目录err = os.Chdir("../")if err != nil {fmt.Println(err)return}path, err = os.Getwd()if err != nil {fmt.Println(err)return}fmt.Println("New working directory:", path)
}

在这里插入图片描述

3. 环境变量

3.1 获取环境变量

Environ:返回所有的环境变量,格式为“key=value”的字符串切片。
Getenv:检索并返回名为key的环境变量的值,如果不存在则返回空字符串。
Setenv:
函数定义:func Setenv(key, value string) error
功能:设置名为key的环境变量,如果出错会返回该错误。

package mainimport ("fmt""os""strings"
)func main() {// 设置环境变量err := os.Setenv("MY_ENV_VAR", "my_value")if err != nil {fmt.Println(err)} else {fmt.Println("Environment variable set successfully")}// 获取并打印刚设置的环境变量value := os.Getenv("MY_ENV_VAR")fmt.Println("MY_ENV_VAR:", value)//查看所有环境变量envs := os.Environ()for _, env := range envs {cache := strings.Split(env, "=")fmt.Printf("key=%v value=%v\n", cache[0], cache[1])}// 清除所有环境变量(谨慎使用)// err = os.Clearenv()// if err != nil {//     fmt.Println(err)// } else {//     fmt.Println("All environment variables cleared")// }
}

在这里插入图片描述

4. 程序退出

Exit:让当前程序以给出的状态码code退出。一般来说,状态码0表示成功,非0表示出错。程序会立刻终止,并且defer的函数不会被执行。

package mainimport ("fmt""os"
)func main() {// 正常退出fmt.Println("Exiting the program successfully")//os.Exit(0)// 异常退出(不会执行到这里的代码)fmt.Println("This line will not be executed")os.Exit(1)
}

在这里插入图片描述

5. 获取系统信息

Hostname:返回内核提供的主机名。
Getuid:返回调用者的用户ID。
Getgid:返回调用者的组ID。
Getpid:返回调用者所在进程的进程ID。

package mainimport ("fmt""os"
)func main() {// 获取主机名hostname, err := os.Hostname()if err != nil {fmt.Println(err)return}fmt.Println("Hostname:", hostname)// 获取用户IDuid := os.Getuid()fmt.Println("User ID:", uid)// 获取组IDgid := os.Getgid()fmt.Println("Group ID:", gid)// 获取进程IDpid := os.Getpid()fmt.Println("Process ID:", pid)
}

在这里插入图片描述

6. 执行外部命令

os/exec包用于执行外部命令,它提供了更高级别的接口来创建和管理进程。

1. 执行简单命令
package mainimport ("fmt""os/exec"
)func main() {//查看系统中是否安装有该命令cmd_path, err := exec.LookPath("ipconfig")if err != nil {fmt.Println(err)return}fmt.Println("系统中有该命令,命令路径为:", cmd_path)//Command每个参数都不能包含空格。多个参数,用引号包裹,逗号隔开cmd := exec.Command("ipconfig")// 如果不需要命令的输出,直接调用cmd.Run()即可err2 := cmd.Run()if err2 != nil {fmt.Println("Error:", err2)} else {fmt.Println("Command executed successfully")}
}

在这里插入图片描述

使用exec.Command函数创建一个代表外部命令的Cmd对象,然后使用Run方法执行命令并等待其完成。
我们使用 exec.Command() 创建了一个执行 ipconfig 命令的 *exec.Cmd,然后使用 Run() 方法启动了命令。

请注意,使用 exec.Command() 创建的命令默认不会有任何输出。如果我们想获取命令的标准输出,我们可以使用 Output() 或 CombinedOutput() 方法。如果我们想获取命令的标准错误输出,我们需要单独设置 Cmd.Stderr 字段。

2. 获取命令输出

使用Output方法运行命令并返回其标准输出的内容。

package mainimport ("fmt""os/exec"
)func main() {//查看系统中是否安装有该命令cmd_path, err := exec.LookPath("ipconfig")if err != nil {fmt.Println(err)return}fmt.Println("系统中有该命令,命令路径为:", cmd_path)cmd := exec.Command("ipconfig")output, err := cmd.Output()if err != nil {fmt.Println("Error:", err)} else {fmt.Println("Command output:", string(output))}
}
3. 处理标准输出和标准错误

CombinedOutput
func (c *Cmd) CombinedOutput() ([]byte, error)
说明:运行命令并返回组合到一起的标准输出和标准错误

package mainimport ("fmt""os/exec"
)func main() {//查看系统中是否安装有该命令cmd_path, err := exec.LookPath("ping")if err != nil {fmt.Println(err)return}fmt.Println("系统中有该命令,命令路径为:", cmd_path)// 创建一个新的命令,例如运行dir命令cmd := exec.Command("ping", "www.baidu.com")//获取标准输出out, err := cmd.CombinedOutput()if err != nil {fmt.Println(err)return}fmt.Println("标准输出为:", string(out))}

在这里插入图片描述

三、文件复制

文件复制需要考虑的问题:
1、拿到需求,分析需求,编辑函数 copy()
2、编写参数(源文件,目标地址,缓冲区大小)
3、读取源文件,保存到缓冲区中
4、读取缓冲区的内容,将内容写入到新文件中
5、确保源文件读取完毕了,使用到for()循环。循环结束标志 io.EOF或者读取到的字节数为0

1. 自定义的文件复制实现

我们创建个目录utils。里面创建个copy.go

package utilsimport ("fmt""io""os"
)// Copy 方法需要参数为:source 源文件 ,destination 目标文件,缓冲区大小
func Copy(source, destination string, bufferSize int) {// 读取文件,读文件open方法就可以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)}}}

在这里插入图片描述

调用我们的copy方法,实现文件copy

package mainimport "jingtian/yufa/io操作/utils"func main() {source := "C:\\Users\\dell\\Desktop\\appsearch.zip"dest := "F:\\goworks\\src\\jingtian\\yufa\\io操作\\目标文件.zip"utils.Copy(source, dest, 1024)
}

在这里插入图片描述

运行,可以将源文件复制到目标地址
在这里插入图片描述

2. 使用系统自带的io.Copy()方法复制

// Copy2 使用系统自带的io.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()// 具体的实现// 不用我们自己写循环读取写入了,直接调用系统的io.Copy()方法// func Copy(dst Writer, src Reader) (written int64, err error) 返回写入的字节数和错误written, err := io.Copy(destinationFile, sourceFile)if err != nil {fmt.Println("复制时出现错误", err)return}fmt.Println("文件的字节大小:", written)
}

3. 使用os.ReadFile和os.WriteFile来实现读取写入,从而实现复制

// Copy3 使用os.ReadFile和os.WriteFile来实现读取写入,从而实现复制
func Copy3(source, destination string) {// func ReadFile(name string) ([]byte, error)fileBuffer, _ := os.ReadFile(source)//func WriteFile(name string, data []byte, perm FileMode) errorerr := os.WriteFile(destination, fileBuffer, 0644)if err != nil {fmt.Println(err)return}fmt.Println("文件复制完成")}

4. io.CopyBuffer() 适合大文件复制

// Copy4 io.CopyBuffer() 适合大文件
func Copy4(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)// 不用我们自己写循环读取写入了,直接调用系统的io.Copy()方法//io.copy这个适合小文件,大文件使用io.CopyBuffer// func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)written, err := io.CopyBuffer(destinationFile, sourceFile, buf)if err != nil {fmt.Println("复制时出现错误", err)return}fmt.Println("文件的字节大小:", written)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/445436.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day01-Qt5入门

day01-Qt5入门 1.下载Qtcreate 官网地址:http://qt-project.org/downloads 2.配置环境变量 将类似于 D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin 的目录添加到环境变量中 3.创建一个新项目 输入自己的项目名称,后面默认下一部 4.运行第一个项目 在窗口…

[红队apt]自解压文件攻击

免责声明:本文用于了解攻击者攻击手法使用,请勿用于非法用途 前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理黑客利用自解压文件进行攻击的流程原理 自解压文件概念 后缀格式:exe 用途: 早期windows系统有些时候没有安装压缩程序&#xf…

GitLab Runner 通过 Pipeline 流水线实现持续集成 CI

文章目录 1、基础环境2、安装 Docker3、安装 GitLab4、安装 JDK5、安装 Maven6、安装 GitLab Runner7、注册 GitLab Runner8、上传 GitLab9、配置 Pipeline 1、基础环境 本次演示搭建,我使用的是阿里云服务器,配置如下: 服务器1:…

微服务swagger解析部署使用全流程

1、介绍 swagger是一个在线接口说明文档&#xff0c;在代码中通过注解的方式将说明问题集成到项目&#xff0c;代码发生修改&#xff0c;说明文档同步修改&#xff0c;前后台联调可以快速同步数据。 2、应用 1、引入依赖 <dependency><groupId>io.springfox<…

ProxyPin 抓包,原来可以这么简单!

你是否还在为网络请求的抓包发愁&#xff1f;其实&#xff0c;ProxyPin 可以让抓包操作变得异常简单&#xff01;不需要复杂的设置&#xff0c;也不用繁琐的配置&#xff0c;轻松几步就能实现。让我们一起来看看吧&#xff01; 抓包操作常用于测试网络请求、分析接口响应&#…

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言&#xff0c;通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…

【网络协议】TCP协议常用机制——延迟应答、捎带应答、面向字节流、异常处理,保姆级详解,建议收藏

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 前几篇文章&#xff0c;博主带大家梳理了一下TCP协议的几个核心机制&#xff0c;比如保证可靠性的 确认应答、超时重传 机制&#xff0c;和提高传输效率的 滑动窗口及其相关优化机…

node.js服务器基础

node.js的事件循环 node.js是基于事件驱动的&#xff0c;通常在代码中注册想要等待的事件&#xff0c;设定好回调函数&#xff0c;当事件触发的时候就会调用回调函数。如果node.js没有要处理的事件了&#xff0c;那整个就结束了;事件里面可以继续插入事件&#xff0c;如果有事…

华为 静态路由和bfd 侦测的实验

实验要求 sw1 上业务地址192.168.1.1/24 SW3 业务地址192.168.2.1/24 正常情况下走主链路&#xff0c;不正常的情况下走备份链路 2 配置 这是基本地址配置 开启了bfd 本端地址为 10.1.1.1 对端地址是10.1.1.2 关键是discrimination 分辨参数 …

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用。 类别&#xff1a;塔吊(Tower-crane) 一种 训练数据已划分&#xff0c;配置文件稍做路径改动即可训练。 训练集&#xff1a; 4724 &#xff08;正面3224 负面1500&#xff09; 验证集&#xf…

纠删码参数自适应匹配问题ECP-AMP实验方案(中)

6.方法设计 6.1.数据获取 为了收集不同的文件大小和纠删码参数对性能指标的影响&#xff0c;本文在Hadoop平台上进行了模拟实验。Hadoop是一种开源的分布式存储和计算框架&#xff0c;它可以支持不同类型的纠删码&#xff0c;并提供了一些应用程序接口和工具来测试和评估纠删…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4&#xff08;location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖&#xff09;-CSDN博客 目录 14.nginx集群&#xff08;前传&#xff09; 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…

选GB28181还是RTSP?

好多开发者&#xff0c;搞不清楚什么时候用GB28181&#xff0c;什么时候用RTSP&#xff0c;本文就二者使用场景和区别&#xff0c;做个大概的探讨&#xff1a; 定义与性质&#xff1a; GB28181&#xff1a;是中国国家标准&#xff0c;全称为《公共安全视频监控联网系统信息传输…

AcWing 905:区间选点 ← 贪心算法

【题目来源】https://www.acwing.com/problem/content/907/【题目描述】 给定 N 个闭区间 [ai,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。【输入格式】 第一行包…

Hopfield神经网络求解旅行商问题(Traveling Salesman Problem,TSP),提供完整MATLAB代码,复制粘贴即可运行

Hopfield神经网络是以美国物理学家约翰霍普菲尔德&#xff08;John Hopfield&#xff09;的名字命名的。他在1982年提出了这种类型的神经网络模型&#xff0c;因此通常被称为Hopfield网络。Hopfield网络是一种早期的人工神经网络&#xff0c;具有以下特点&#xff1a; 递归连接…

3、Docker搭建MQTT及Spring Boot 3.x集成MQTT

一、前言 本篇主要是围绕着两个点&#xff0c;1、Docker 搭建单机版本 MQTT&#xff08;EMQX&#xff09;&#xff0c;2、Spring Boot 3.x 集成 MQTT&#xff08;EMQX&#xff09;&#xff1b; 而且这里的 MQTT&#xff08;EMQX&#xff09;的搭建也只是一个简单的过程&#x…

linux 安装gitlab

安装环境 CentOS 7.7 (centos6.10会报错)2g内存防火墙关闭 安装步骤&#xff1a; 1 安装gitlab # yum install -y git curl policycoreutils-python openssh-server # 安装依赖 # wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.2.2-ce…

欧派家居被下调盈利预测:销售费用创新高,零售经销渠道压力不小

《港湾商业观察》王璐 在房地产等多重因素冲击之下&#xff0c;上半年不少家居上市公司交出的业绩答卷都不尽理想&#xff0c;这其中也包括了消费者所熟知的“家居一哥”欧派家居&#xff08;603833.SH&#xff09;。 从2023年下半年开始&#xff0c;胡歌的代言令全民对欧派家…

鸿蒙UI系统组件16——富文本编辑器(RichEditor)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 RichEditor是支持图文混排和文本交互式编辑的组件&#xff0c;通常用于响应用户的对…

【C++入门篇 - 3】:从C到C++第二篇

文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意&#xff1a;在C语言中&#xff0c;如果内存不够…