Go基础-文件、字符

2023-09-15 13:21:35

文件创建

导入“os”包,创建文件,读写文件的函数都在改包。
指定创建的文件存放路径以及文件名。
执行Create( )函数,进行文件创建。
关闭文件。

package main

import (
	"fmt"
	"os"
)

func main() {
	//创建文件,需要指定文件的存放路径以及文件名称
	//file 为文件指针
	file, err := os.Create("D:/test/a.txt")
	//判断是否出现异常
	if err != nil {
		fmt.Println(err)
		//文件错误,也要关闭文件
		//file.Close()
		return
	}

	defer file.Close() //延迟执行
	//对创建的文件进行相关的操作

	关闭
	//file.Close()
}

写入数据_writestring方法—写入string信息到文件

不会追加,会清空文件然后添加数据

package main

import (
	"fmt"
	"os"
)

func main() {
	//创建文件,需要指定文件的存放路径以及文件名称
	//file 为文件指针
	file, err := os.Create("D:/test/a.txt")
	//判断是否出现异常
	if err != nil {
		fmt.Println(err)
		//文件错误,也要关闭文件
		//file.Close()
		return
	}

	defer file.Close() //延迟执行

	// 数据长度
	n, err := file.WriteString("cccc") //写入ccc然后再写成ddd,只会出现dddd并不会追加
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(n) //n为数据的长度

}

写入数据_write方法----写入byte类型的信息到文件

不会追加,会清空文件然后添加数据

package main

import (
	"fmt"
	"os"
)

func main() {
	//创建文件,需要指定文件的存放路径以及文件名称
	//file 为文件指针
	file, err := os.Create("D:/test/c.txt")
	//判断是否出现异常
	if err != nil {
		fmt.Println(err)
		//文件错误,也要关闭文件
		//file.Close()
		return
	}

	defer file.Close() //延迟执行

	var str string = "Hello1 world"
	n, err := file.Write([]byte(str)) //需要将字符串转换为字节切片
	if err != nil {
		return
	}
	fmt.Println(n) //n为数据的长度
}

写入数据WriteAt方法–在指定位置开始写入byte类型的信息

第一个参数为在逛光标最后一个位置然后执行得到0
seek, err := file.Seek(0, io.SeekEnd) //把光标定位到文件中原有内容的后面,返回文件原油有数据的长度
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	//创建文件,需要指定文件的存放路径以及文件名称
	//file 为文件指针
	file, err := os.Create("D:/test/a.txt")
	//判断是否出现异常
	if err != nil {
		fmt.Println(err)
		//文件错误,也要关闭文件
		//file.Close()
		return
	}

	defer file.Close() //延迟执行
	file.WriteString("hello world")

	var str string = "aaa"
	seek, err := file.Seek(0, io.SeekEnd) //把光标定位到文件中原有内容的后面
	if err != nil {
		return
	}
	//第一个参数 字节切片,第二个参数指定位置写入数据
	n, err := file.WriteAt([]byte(str), seek) //单独写入,也不会追加
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(n) //n为数据的长度
}

向已经存在文件中写入数据----OpenFile( )使用

OpenFile( )这个函数有三个参数:
第一个参数表示:打开文件的路径
第二个参数表示:模式,常见的模式有
O_RDONLY(只读模式),O_WRONLY(只写模式), O_RDWR( 可读可写模式),O_APPEND(追加模式)。

第三个参数表示: 权限,取值范围(0-7)
表示如下:
0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3: 写权限与执行权限
4:读权限
5: 读权限与执行权限
6: 读权限与写权限
7: 读权限,写权限,执行权限

package main

import (
	"fmt"
	"os"
)

func main() {
	//创建文件,需要指定文件的存放路径以及文件名称
	//file 为文件指针
	//file, err := os.OpenFile("D:/test/a.txt", os.O_APPEND, 6)//追加
	file, err := os.OpenFile("D:/test/a.txt", os.O_RDWR, 6) //可读可写,从文件最开始的位置开始写入的
	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()

	//通过文件指针向文件中写入数据或者读写数据
	writeString, err := file.WriteString("ziyeye")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(writeString)
}

读取文件数据

读取文件的基本流程如下:
打开要读取的文件
对文件进行读取
关闭文件

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	//打开要读取的文件
	file, err := os.Open("D:/test/a.txt") //只读方式
	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()
	//进行文件内容读取
	//定义一个字符类型切片,存储从文件中读取的数据
	buffer := make([]byte, 1024*2)
	n, err := file.Read(buffer)
	if err != nil {
		if err == io.EOF {
			fmt.Println(err)
		}
		return
	}
	//关闭文件
	fmt.Println(n)
	fmt.Println(string(buffer[:n]))
}

循环读取文件内容

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	//打开要读取的文件
	file, err := os.Open("D:/test/a.txt") //只读方式
	if err != nil {
		fmt.Println(err)
		return
	}

	defer file.Close()
	//进行文件内容读取
	//定义一个字符类型切片,存储从文件中读取的数据
	buffer := make([]byte, 10)
	for true {
		n, err := file.Read(buffer)
		if err != nil {
			if err == io.EOF { //表示到达文件末尾了
				fmt.Println(err)
				break
			}
		}
		fmt.Println(n)
		fmt.Println(string(buffer[:n]))
	}
	//关闭文件

}

案例

文件拷贝,将已有的文件复制一份,同时重新命名。

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	//打开原有文件
	file, err := os.Open("D:/test/a.txt")
	if err != nil {
		fmt.Println(err)
	}

	defer file.Close()
	//创建一个新的文件
	file2, err := os.Create("D:/test/zi.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file2.Close()

	//将原有文件中的内容读取出来,然后写入到新的文件中
	buffer := make([]byte, 10)

	for true {
		n, err := file.Read(buffer)
		if err != nil {
			if err == io.EOF {
				fmt.Println(err)
				break
			}
			fmt.Println(err)
		}
		file2.Write(buffer[:n])
	}
	//关闭文件

}

字符串常用方法

Contains(s,substr string) bool
功能:字符串s中是否包含substr返回bool值
Join(a[]string,sep string) string
功能:字符串连接,把切片 a通过sep连接起来
Index(s,sep string) int
功能:在字符串s中查找sep所在的位置,返回位置值,找不到返回-1
Repeat(s string,count int) string
功能:重复s字符串count次,最后返回重复的字符串
Replace(s,old,new string,n int) string
功能:在s字符串吧old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换
Split(s,sep string)[]string
功能:把s字符串按照sep分隔,返回slice(切片)
Trim(s string,cutset string) string
功能:在s字符串的头部和尾部取出cutset指定的字符串
Fields(s string) [] string
功能:去除s字符串的空格符,并且按照空格分隔返回切片

文档地址:https://studygolang.com/pkgdoc

package main

import (
	"fmt"
	"strings"
)

func main() {
	var str string = "hellogo"
	contains := strings.Contains(str, "go") //是否包含go 判断某个字符串是否在str中存在,如果存在返回true否则返回false
	fmt.Println(contains)                   //true
	contains = strings.Contains(str, "goo") //是否包含go
	fmt.Println(contains)                   //false

	str1 := []string{"abc", "hello", "world"}
	join := strings.Join(str1, "|")
	fmt.Println(join) //abc|hello|world

	//Index 查找某个位置
	var str2 string = "abcHello"
	index := strings.Index(str2, "Hello") //判断Hello在str中出现的位置,注意位置从0开始计算
	fmt.Println(index)

	repeat := strings.Repeat("go", 3) //表示字符串go重复三次
	fmt.Println(repeat)               //gogogo

	//Replace
	str3 := "hello world"
	replace := strings.Replace(str3, "l", "ye", 1) //负数如-1为全部替换 用新的字符串替换旧的字符串,第四个参数表示替换的次数
	fmt.Println(replace)                           //heyelo world

	//Split
	str4 := "ziye@woaini@aini"
	split := strings.Split(str4, "@")
	fmt.Println(split) //[ziye woaini aini]
}

案例

让用户输入一个日期格式,如:2018-01-02, 输出日期为2008年1月2日

package main

import (
	"fmt"
	"strings"
)

func main() {
	//输入日期
	fmt.Println("请输入日期,格式:年-月-日")
	var str string
	fmt.Scan(&str)
	//按照-进行分隔
	split := strings.Split(str, "-")
	//输出指定的格式
	fmt.Println(split[0] + "年" + split[1] + "月" + split[2] + "日")
}

让用户输入一句话,判断这句话中有没有“邪恶”,如果有“邪恶”就替换成“**”,然后输出。 如:老王很邪恶,输出后变成老王很xxx

package main

import (
	"fmt"
	"strings"
)

func main() {
	//定义变量存储用户输入的一句话
	fmt.Println("请输入一句话")
	var str string
	fmt.Scan(&str)
	//判断用户输入的内容中是否有邪恶
	if strings.Contains(str, "邪恶") {
		str = strings.Replace(str, "邪恶", "**", -1)
	}
	//如果有,则进行替换
	fmt.Println(str)
}

字符串转换

把其他类型的转换为字符串。
把字符串转换为其他类型

https://blog.csdn.net/qq_40432598/article/details/132702749?spm=1001.2014.3001.5502

更多推荐

免费可源可商用的BI工具对比(支持Doris 数据库)

目前市面上有很多开源的BI工具可供选择,以下是几个免费、开源且可以商用的BI工具,并且支持和Doris数据库结合使用:Superset:由Airbnb发起的开源BI工具,带有可视化和交互式仪表盘功能。Superset支持多种数据源,其中包括Doris数据库。Metabase:一个简单易用的BI工具,支持数据可视化和SQ

全链路自动化测试

背景从SOA架构到现在大行其道的微服务架构,系统越拆越小,整体架构的复杂度也是直线上升,我们一直老生常谈的微服务架构下的技术难点及解决方案也日渐成熟(包括典型的数据一致性,系统调用带来的一致性问题,还是跨节点跨机房复制带来的一致性问题都有了很多解决方案),但是有一个环节我们明显忽略了。在现在的微服务架构趋势下,微服务在

陆拾捌- 如何通过数据影响决策(三)

一、如何正确的引导别人?引导与误导的区别是什么?看下面这广告图单看上面大字的结果,感觉好像真的使用过的人均觉得有好处可如果我们看下面的细字对111位连续14天食用(本产品)的燕麦片非重度使用者所做调研…从理性上来说,如果一个人觉得没用处,还会连续食用14天吗?所以这里用的一个技巧就是,从数据中各个维度深挖,然后把最有利

【C# 基础精讲】构造函数和析构函数

构造函数(Constructor)和析构函数(Destructor)是面向对象编程中的两个重要概念,它们分别用于在对象创建和销毁的时候执行特定的操作。这两个函数在C#以及其他面向对象编程语言中都具有重要的作用,用于初始化对象的状态、分配资源,以及在对象被销毁时释放资源。在本文中,我们将详细探讨构造函数和析构函数的概念、

Java乐观锁的实现

乐观锁是一种用于解决并发冲突的机制,它基于假设在大多数情况下没有并发冲突的原则。与悲观锁不同,乐观锁不会对数据加锁,而是通过一定的方式来检测并处理并发冲突。在实现乐观锁时,通常会使用版本号或时间戳作为标识。当多个线程同时访问同一个数据时,每个线程都会读取到数据的当前版本号或时间戳。在更新数据时,线程会比较当前的版本号或

【AI视野·今日CV 计算机视觉论文速览 第250期】Wed, 20 Sep 2023

AI视野·今日CS.CV计算机视觉论文速览Wed,20Sep2023Totally95papers👉上期速览✈更多精彩请移步主页DailyComputerVisionPapersPanopticNeRF-360:Panoramic3D-to-2DLabelTransferinUrbanScenesAuthorsXia

WebGL 用鼠标控制物体旋转

目录鼠标控制物体旋转如何实现物体旋转示例程序(RotateObject.js)代码详解示例效果鼠标控制物体旋转有时候,WebGL程序需要让用户通过鼠标操作三维物体。这一节来分析示例程序RotateObject,该程序允许用户通过拖动(即按住左键移动)鼠标旋转三维物体。为了简单,示例程序中的三维物体是一个立方体,但拖曳鼠

新型智慧公厕“1+3+N”架构,平台、系统、应用的创新

近年来,随着人民生活水平的提高,人们对公共设施的要求也越来越高。其中,如厕问题一直是人们关注的焦点,但传统的公厕设施已经不能满足人们对干净、舒适、安全的需求,这促使了新型智慧公厕的诞生与应用,以如中期科技「智慧公厕-智慧厕所」以“1+3+N”规划策略,让公共厕所实现信息化、智慧化、网络化。本文以智慧公厕源头厂家广州中期

二叉搜索树经典笔试题【力扣、牛客】

文章目录1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先1.法一:定位p、q在左还是右分类讨论2.法二:利用stack求出p、q路径求相交值5.二叉搜索树与双向链表1.法一:递归:递归过程修正指针指向2.数组:将二叉搜索树进行中序遍历可以得到由小到大的顺序排列6.前序中序遍历序

Spark_Spark内存模型管理

工作中经常用到Spark内存调参,之前还没对这块记录,这次记录一下。环境参数spark内存模型中会涉及到多个配置,这些配置由一些环境参数及其配置值有关,为防止后面理解混乱,现在这里列举出来,如果忘记了,可以返回来看看:spark.executor.memory:JVMOn-Heap内存(堆内内存),在使用sparksu

云服务器部署k8s集群

在两台不同厂商的云服务器上部署k8s集群,遇到一些问题。在此进行下总结。首先要网络能够互通,我是通过添加虚拟网卡的方式lsmod|grepip_vs#检查是否有开启#临时开启ip_vsforiin$(ls/lib/modules/$(uname-r)/kernel/net/netfilter/ipvs|grep-o"^

热文推荐