go语言的成神之路-标准库篇-os标准库

一、权限

在操作系统(OS)中,标准库的权限管理是非常重要的,它确保了不同用户和进程能够安全地访问系统资源。以下是一些常见的权限概念和说明:

1.用户权限

  • 用户ID(UID):每个用户在系统中都有一个唯一的用户ID。根用户(root)的UID通常是0。
  • 组ID(GID):用户可以属于一个或多个组,每个组也有一个唯一的组ID。

2. 文件权限

  • 读(r):允许用户读取文件内容。
  • 写(w):允许用户修改文件内容。
  • 执行(x):允许用户执行文件(如果文件是可执行的)。

文件权限通常表示为三个八进制数字,分别代表所有者、组和其他用户的权限。例如,权限 755 表示:

  • 所有者有读、写和执行权限(7 = 4+2+1)。
  • 组用户有读和执行权限(5 = 4+1)。
  • 其他用户有读和执行权限(5 = 4+1)。

3. 目录权限

  • 读(r):允许用户列出目录内容。
  • 写(w):允许用户在目录中创建或删除文件。
  • 执行(x):允许用户进入目录(即访问目录中的文件)。

4. 权限设置命令

  • chmod:用于更改文件或目录的权限。例如,chmod 755 file.txt 将文件 file.txt 的权限设置为 755
  • chown:用于更改文件或目录的所有者。例如,chown user:group file.txt 将文件 file.txt 的所有者更改为 user,组更改为 group
  • chgrp:用于更改文件或目录的组。例如,chgrp group file.txt 将文件 file.txt 的组更改为 group

5. 特殊权限

  • SUID(Set User ID):当一个可执行文件设置了SUID位时,任何用户执行该文件时都会以文件所有者的权限运行。
  • SGID(Set Group ID):当一个目录设置了SGID位时,新创建的文件将继承目录的组权限。
  • 粘滞位(Sticky Bit):当一个目录设置了粘滞位时,只有文件的所有者或目录的所有者可以删除该目录中的文件。

6. 权限检查

  • access:用于检查用户是否有权限访问文件。例如,access("file.txt", R_OK) 检查当前用户是否有读取 file.txt 的权限。

7.权限管理工具

  • sudo:允许普通用户以超级用户(root)权限执行命令。
  • su:切换用户身份。例如,su root 切换到根用户。

二、目录文件等相关操作

1.os.Create

os.Create 函数用于创建一个新文件或截断一个已存在的文件。如果文件已经存在,它将被截断为零长度。

func main() {f, err := os.Create("test.txt")if err != nil {fmt.Println(err)return}defer f.Close()
}

 创建文件的时候文件中的内容会被清空

text.txt中原本有一行文本

运行完main.go之后会被清空

2.os.Mkdir和os.MkdirAll

os.Mkdir 函数用于创建一个新目录。如果目录已经存在,os.Mkdir 会返回一个错误。

os.MkdirAll 函数用于创建一个多级新目录。如果目录已经存在,os.MkdirAll 会返回一个错误。

 Mkdir代码示例:

func textMkdir() {err := os.Mkdir("testdir", 0777)if err != nil {fmt.Println(err)return}
}

运行代码之后会在左侧创建一个新的目录,新目录与main.go同级。 

 

MkdirAll代码示例:

func textMkdirAll() {err := os.MkdirAll("testdir1/testdir2/testdir3", 0777)if err != nil {fmt.Println(err)return}
}

与Mkdir不同的是它可以创建多级目录 

3.os.Remove和os.RemoveAll

os.Remove函数用于删除一个新目录。如果目录已经存在,os.Remove会返回一个错误。

os.RemoveAll函数用于删除一个多级新目录。如果目录已经存在,os.RemoveAll会返回一个错误。

// 删除单个文件或目录
func textRemove() {err := os.Remove("test.txt")if err != nil {fmt.Println(err)return}
}// 删除目录及其内容
func textRemoveAll() {err := os.RemoveAll("testdir1")if err != nil {fmt.Println(err)return}
}

删除之前的目录 

删除之后的目录

3.os.Getwd

// 获取当前工作目录
func textGetwd() {dir, err := os.Getwd()if err != nil {fmt.Println(err)return}fmt.Println(dir)
}

可以获取main.go所属的目录 

4.os.Chdir

// 修改当前工作目录
func textChdir() {err := os.Chdir("testdir")if err != nil {fmt.Println(err)return}
}

 

可以看出工作目录被修改完成。

5. os.TempDir

// 获取临时目录
func textTempDir() {dir := os.TempDir()fmt.Println(dir)
}

6.os.Rename

// 修改文件名称
func textRename() {err := os.Rename("text01.txt", "text1.txt")if err != nil {fmt.Println(err)return}
}

三、文件读取详解

在 Go 语言中,文件读取可以通过多种方式实现,具体取决于你的需求。下面是几种常见的文件读取方法的详细讲解。

1.使用 ioutil.ReadFile 函数

这种方法适合小型文件,简单易用。

func textReadFile() {// 读取文件data, err := ioutil.ReadFile("text1.txt")if err != nil {log.Fatalf("读取文件时出错: %v", err)}// 输出文件内容fmt.Println(string(data))
}

2.使用 os.Open 和 bufio.Scanner

这种方法适合逐行读取文件,尤其是处理大文件时。

func textOpenFile() {file, err := os.Open("text2.txt")if err != nil {fmt.Println(err)return}defer file.Close() // 确保在函数结束时关闭文件scanner := bufio.NewScanner(file)for scanner.Scan() {fmt.Println(scanner.Text()) // 逐行打印文件内容}// 检查扫描过程中是否出现错误if err := scanner.Err(); err != nil {fmt.Println(err)}
}

3.使用 os.Open 和 io.Reader 读取文件

这种方法使你能够自定义读取逻辑,比如限量读取等。

func textReader() {// 尝试打开名为 "example.txt" 的文件file, err := os.Open("example.txt")if err != nil {// 如果打开文件时发生错误,打印错误信息并返回fmt.Println(err)return}// 确保在函数退出时关闭文件defer file.Close()// 创建一个大小为 1024 字节的缓冲区,用于读取文件内容buffer := make([]byte, 1024) for {// 读取文件中的数据到缓冲区,并返回实际读取的字节数 n 和可能的错误n, err := file.Read(buffer)// 检查读取过程中是否出现错误,且错误不是文件末尾指示符if err != nil && err != io.EOF {// 打印错误信息并返回fmt.Println(err)return}// 如果返回的字节数为 0,表示已读到文件末尾if n == 0 {break}// 打印缓冲区中读取的数据(仅打印实际读取的字节数,避免多余的打印)fmt.Print(string(buffer[:n])) }
}

四、文件写入操作

在 Go 语言中,文件写入操作可以通过多个方式实现。下面详细介绍几种常见的文件写入方法。

1. 使用 os.Create 和 io.WriteString

这种方法适合创建新文件并写入内容。如果文件已存在,将被截断。

func TextCreateFile() {// 创建新文件(若文件已存在则被截断)file, err := os.Create("text01.txt")if err != nil {fmt.Println("创建文件时出错:", err)return}defer file.Close() // 确保在函数最后关闭文件// 写入字符串到文件_, err = file.WriteString("Hello, Go!\n")if err != nil {fmt.Println("写入文件时出错:", err)return}fmt.Println("成功写入文件!")
}

2. 使用 os.OpenFile 以追加模式写入

这种方法适合在已有文件的末尾添加内容,而不会覆盖原有内容。

func textOpenfile() {// 打开一个文件,如果不存在则创建,权限为 0644file, err := os.OpenFile("text02.txt", os.O_APPEND|os.O_WRONLY, 0644)if err != nil {fmt.Println("打开文件时出错:", err)return}defer file.Close() // 确保在函数最后关闭文件_, err = file.WriteString("Appending this line.\n")if err != nil {fmt.Println("写入文件时出错:", err)return}fmt.Println("成功追加内容到文件!")
}

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

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

相关文章

ASP.NET|日常开发中连接Sqlite数据库详解

ASP.NET|日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表(以简单的用户表为例…

机器学习:监督学习、无监督学习

1. 引言 机器学习是一种人工智能领域的技术,它旨在让计算机通过学习数据和模式,而不是明确地进行编程来完成任务。 机器学习分为监督学习、无监督学习、半监督学习、强化学习 四种。 ​ 2. 监督学习 2.1 什么是监督学习 定义:根据已有的数…

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要:南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日,南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

MySQL-DML之数据表操作

文章目录 一. 插入表记录1. 向表中插入部分字段2. 向表中插入所有字段,字段的顺序为创建表时的顺序3. 一次添加多条数据信息 二. 更新表记录1. 更新所有记录的指定字段2. 更新符号条件记录的指定字段 三. 删除表记录1. 按条件删除记录2. 清空记录 四. SQL约束1. 主键约束① 添加…

Exp 智能协同管理系统前端首页框架开发

一、 需求分析 本案例的主要目标是开发一个智能学习辅助系统的前端界面,涵盖以下功能模块: 首页:显示系统的总体概览和关键功能介绍。 班级学员管理:实现班级管理和学员管理。 系统信息管理:管理部门和员工信息。 …

5G中的ATG Band

Air to Ground Networks for NR是R18 NR引入的。ATG很多部分和NTN类似中的内容类似。比较明显不同的是,NTN的RF内容有TS 38.101-5单独去讲,而ATG则会和地面网络共用某些band,这部分在38.101-1中有描述。 所以会存在ATG与地面网络之间的相邻信…

MongoDB与阿里云庆祝合作五周年,展望AI赋能新未来

12月3日,在印尼举行的阿里云合作伙伴大会2024上,MongoDB荣膺阿里云“2024技术创新成就奖”,该奖项旨在表彰与阿里云保持长期稳定合作,通过深度技术融合,在产品技术创新、行业区域深耕等领域取得卓越成就的伙伴。自2019…

未来已来:人工智能如何重塑我们的生活与工作

引言 未来的生活和工作场景正从想象走向现实。想象一下,一个清晨,语音助手已经为你安排好一天的任务,自动驾驶汽车准时送你上班,智能冰箱提醒你需要补充的食材。曾经只存在于科幻小说中的场景,如今正在我们的身边实现。…

苹果全家桶接入ChatGPT,近屿智能邀您共绘AI蓝图

北京时间12月12日凌晨,OpenAI开启了备受瞩目的第五天技术直播。宣布了一个令人振奋的消息:苹果的iPhone、iPad、Mac以及智能助手Siri可以原生使用ChatGPT。 这一合作无疑为生成式AI赛道注入了新的活力,作为全球科技行业的巨头,苹果…

企业级日志分析系统ELK之ELK概述

ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件,如果应用出现问题,开发和运维人员想排 查原因,就要先找到相应的主机上的日志文件再进行查找和分析,所以非常不方便,而且还涉及…

安全攻击平台介绍

目录 XSS攻击平台 Attack API BeEF XSS-Proxy 漏洞平台 cnvd 阿里云漏洞库 攻防演练平台 XCTF 攻防平台 零日靶场(0ops) 安恒靶场(赛宁安全) XSS攻击平台 XSS Payload如此强大,为了使用方便,有安…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫 机

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【电机控制器】FM33LF015芯片——FLASH模拟EEPROM

【电机控制器】FM33LF015芯片——FLASH模拟EEPROM 文章目录 [TOC](文章目录) 前言一、概述二、代码三、实验四、参考资料总结 前言 使用工具: 1.ARM仿真器/J-OBV2仿真器 提示:以下是本篇文章正文内容,下面案例可供参考 一、概述 二、代码 …

算法日记48 day 图论(拓扑排序,dijkstra)

今天继续图论章节,主要是拓扑排序和dijkstra算法。 还是举例说明。 题目:软件构建 117. 软件构建 (kamacoder.com) 题目描述 某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件…

物联网安全-ARMv8-M Trustzone 实操

前言 本文针对ARMv8m架构M23/M33 MCU安全特性使用进行介绍,以nxp LPC55xx系列和STM32L5xx系列为例,为大家阐述如何使用Trustzone技术提高物联网设备安全性,适合有一定平台安全基础的物联网设备开发人员、安全方案开发人员。 背景 为了提升平台安全性,ARM推出了ARMv8m架构…

若依集成Uflo2工作流引擎

文章目录 1. 创建子模块并添加依赖1.1 新建子模块 ruoyi-uflo1.2 引入 Uflo2 相关依赖 2. 配置相关 config2.1 配置 ServletConfig2.2 配置 UfloConfig2.3 配置 TestEnvironmentProvider 3. 引入Uflo配置文件4. 启动并访问 Uflo2 是由 BSTEK 自主研发的一款基于 Java 的轻量级工…

linux启动流程

linux 启动详细流程 启动流程主要分为四个阶段:BIOS与UEFI->bootloader->kernel->busybox()init,下面从这四个方面展开 BIOS与UEFI 由于计算机启动是一个很矛盾的过程,即必须先运行程序,然后计算机才能启动,但是计算机不…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…

【1211更新】腾讯混元Hunyuan3D-1文/图生3D模型云端镜像一键运行

目录 项目介绍 显存占用 11月21 新增纹理烘焙模块Dust3R 烘焙相关参数: AutoDL云端镜像 启动说明 标准模型下载 【1212更新】腾讯混元Hunyuan3D-1文图生3D模型云端镜像一键运行 项目介绍 https://github.com/Tencent/Hunyuan3D-1 腾讯混元 3D 生成模型,支持…

大数据笔记之flink-cdc实时同步数据

大数据笔记之flink-cdc实时同步数据(mysql -->doris) 一、基本概念 Flink CDC 是一个基于流的数据集成工具,旨在为用户提供一套功能更加全面的编程接口(API)。 该工具使得用户能够以 YAML配置文件的形式,优雅地定义其 ETL&…