【Hello Go】Go语言文本文件处理
文本文件处理
- 字符串处理
- 字符串操作
- Contains
- Join
- index
- repeat
- Replace
- Split
- Trim
- Fields
- 字符串转换
- Append
- Format
- Parse
- 正则表达式
- Json处理
- 编码Json
- 通过结构体生产Json
- 通过map生产json
- 解码Json
- 解析到结构体
- 解析到interface
- 文件操作
- 相关api介绍
- 建立和打开文件
- 关闭文件
- 写文件
- 读文件
- 删除文件
- 示例代码
- 写文件
- 读文件
- 拷贝文件
字符串处理
字符串在开发的过程中经常用到 比如在用户的输入或者是数据库的读取操作中
我们经常需要对于字符串进行分割 链接 旋转等操作 我们可以通过Go语言标准库中的strings 和 strconv 两个包中的函数进行相应的操作
字符串操作
下面的函数来自于strings包 这里只介绍一些常用的函数 更加详细的介绍请参考Go语言的官方文档
Contains
函数原型如下
func Contains(s, substr string) bool
功能: 字符串s中是否包含substr 返回一个bool值 如果存在返回true 如果不存在返回false
值得注意的一点是空串在任意字符串中都存在
Join
函数原型如下
func Join(a []string, sep string) string
功能: 将切片a中的所有string通过sep链接起来 最后返回我们一个链接完毕的string
演示代码和效果如下
a := [] string{"foo" , "bar" , "baz"}
fmt.Println(strings.Join(s, ", "))
// 最后输出结果是 foo,bar,baz
index
函数原型如下
func Index(s, sep string) int
功能: 在字符串s中寻找sep的位置 找到返回位置值 找不到返回-1
fmt.Println(strings.Index("chicken", "ken")) // 4fmt.Println(strings.Index("chicken", "dmr")) // -1
repeat
函数原型如下
func Repeat(s string, count int) string
功能:重复字符串s n次 并且返回重复后的字符串
代码示例如下
fmt.Println("ba" + strings.Repeat("na", 2)) // banana
Replace
函数原型如下
func Replace(s, old, new string, n int) string
功能:把s字符串中old字符串替换为new字符串 n表示替换的次数 如果n小于0 则表示全部替换
var s string = "oink oink oink"fmt.Println(strings.Replace(s, "k", "ky", 2)) // oinky oinky oinkfmt.Println(strings.Replace(s, "oink", "oi", -1)) // oi oi oi
Split
函数原型如下
func Split(s, sep string) []string
功能: 把s字符串按照sep切割 最后返回一个切片
fmt.Printf("%q\n", strings.Split("hello aa dasdasd dasdax3w", " ")) // ["hello" "aa" "dasdasd" "dasdax3w"]fmt.Printf("%q", strings.Split(" xyz ", "")) // [" " "x" "y" "z" " "]
Trim
函数原型如下
func Trim(s string, cutset string) string
功能: 在s字符串的头部和尾部去除cutset字符串
fmt.Println(strings.Trim("!!! hello world @!!!!!!", " !@")) // hello world
Fields
函数原型如下
func Fields(s string) []string
功能:去除s字符串的空格符,并且按照空格分割返回切片
func main() {fmt.Printf("%q", strings.Fields("str abc adw")) // str abc adw
}
字符串转换
字符串转换函数在包 strconv 中 如下 我们也只是列出一些常用的函数
Append
append系列函数将各种类型转化为字符串之后 添加到现有的字符数组中
下面是示例代码
str := make([]byte, 0, 100) // 创建一个长度为0的byte切片 预留长度大小为100str = strconv.AppendInt(str, 1234, 10) // 以10进制的方式往后添加1234str = strconv.AppendBool(str, false)str = strconv.AppendQuote(str, "hello world")str = strconv.AppendQuoteRune(str, '单')fmt.Println(string(str)) // 最后结果是1234false"hello world"'单'
Format
format系列函数将其他类型转化为字符串
代码演示如下
a := strconv.FormatInt(1234, 10) // 将1234 以10进制的方式转化为字符串b := strconv.FormatBool(false) // 讲false转化为字符串c := strconv.Itoa(1022)fmt.Println(a, b, c) // 1234 false 1022
Parse
parse系列函数将字符串转化为其他类型 但是转化的过程中有可能会失败 所以说我们要用一个err来接受看看是否转化失败 如果转化失败了 我们可以使用一个函数将其打印出来
func checkError(e error) {if (e != nil) {fmt.Println(e)}
}func main() { a , err := strconv.ParseInt("1234" , 10 , 64) // 将字符串1234 以10进制的方式转化为64位大小的int类型数据1234checkError(err) fmt.Println(a)
}
正则表达式
正则表达式是一个较为庞大的内容 以后会单独开一篇博客来解释 此处就不过多赘述
Json处理
JSON是一种比XML更加轻量级的数据交换格式 在易于人们阅读和编写的同时也易于程序的编译和运行 尽管JSON是JavaScript的一个子集 但是json采用完全独立于编程语言的文本格式 并且表现为 键值对集合的文本描述形式 (类似于字典结构 ) 这使他成为一个跨平台 跨语言的数据交换语言
原来的信息如下
char name = "小明";
int age = 18;
float score[3] = {88.5, 99, 58};
转变为json存储之后如下
{"姓名" : "小明","年龄" : 18,"成绩" : [88.5, 99, 58]}
json存储实际上是将原来的数据变成了一个字符串 (也就是说上面的代码实际上就是一个字符串)
json 数据类型:对象,数组,字符串,数字 介绍如下
- 对象:使用花括号 {} 括起来的表示一个对象。
- 字符串:使用常规双引号 “” 括起来的表示一个字符串
- 数字:包括整形和浮点型,直接使用。
- 数组:使用中括号 [] 括起来的表示一个数组。
也就是说 如果我们有多组同类型的数据 我们可以使用数组组织起来
代码表示如下
[{"姓名" : "小明","年龄" : 18,"成绩" : [88.5, 99, 58]},{"姓名" : "小黑","年龄" : 18,"成绩" : [88.5, 99, 58]}
]
编码Json
通过结构体生产Json
使用json.Marshal()函数可以对一组数据进行json格式的编码 函数原型如下
func Marshal(v interface{}) ([]byte, error)
还有一个格式化输出
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error
示例代码如下
t1 := IT{"itcast", []string{"Go", "C++"}, true, 666.66}// 下面生成一段json格式的文本b, err := json.Marshal(t1)// 如果成功 则err将会是空 b将会是一段json格式的文本 // {"Company":"itcast","Subjects":["Go","C++"],"IsOK":true,"Price":666.66}if err == nil {fmt.Println(string(b))} else {fmt.Println("error!!!!")fmt.Println(err)}
json.MarshalIndent 函数是 Go 语言中用于将数据结构转换为带有缩进格式的 JSON 字符串的函数。它提供了更易读的输出格式,便于阅读和调试。
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
这里主要介绍下prefix 和 indent参数
- prefix 每行的前缀 如果我们将其赋值为 “hello” 那么以后每一行都会先打印一个hello
- indent 表示缩进的大小 我们一般使用空字符串来进行缩进
下面是缩进后的格式

struct tag
我们可以看到上面的输出字段首字母都是大写的 那如果我们想要首字母小写怎么办呢 将结构体中的标识符修改为小写嘛
可是当我们将结构体中的标识符修改为小写之后我们发现json 不输出该字段
所以说我们写Json的时候需要注意 只有当导出字段的首字母是大写才会输出 如果我们修改字段为小写 就会发现该字段不会输出了
所以说我们必须要定义struct tag来实现
在Go语言中 结构体字段可以通过 tag 来进行注释和元数据的添加 它位于字段的后方 并且被反引号包围
我们的定义struct tag的时候需要注意的几点是
- 字段的tag是"-",那么这个字段不会输出到JSON
- tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中
- tag中如果带有"omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中
- 如果字段类型是bool, string, int, int64等,而tag中带有",string"选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
type IT struct {Company string `json:"-"` // 这里表示company不会出现在Json中Subjects []string `json:"subjects"` // 这里对于Subjiects重新命名了 所以说在最后会显示subjectsIsOK bool `json:",string"` // 先转化为字符串再输出Price float64 `json:omitempty` // 如果Price为空 就不输出
}
最后结果如下

通过map生产json
func main() {t1 := make(map[string]interface{})t1["k1"] = truet1["k2"] = 1234t1["k3"] = "hello world"b, err := json.MarshalIndent(t1, "", " ")if err == nil {fmt.Println(string(b))}
}
生产结果如下
{ "k1": true, "k2": 1234, "k3": "hello world"
}
解码Json
可以使用json.Unmarshal()函数将JSON格式的文本解码为Go里面预期的数据结构
json.Unmarshal()函数的原型如下
func Unmarshal(data []byte, v interface{}) error
该函数的第一参数是json格式的文本( 字节序列 ) 第二个参数是目标输出容器 用于存放转化后的值
解析到结构体
代码演示如下 其实就是调用了下Unmarshal函数 此外并无其他难点
t1 := IT{"itcast", []string{"Go", "C++"}, true, 666.66}b, err := json.MarshalIndent(t1, "", " ")if err == nil {fmt.Println(string(b))}var t2 ITerr = json.Unmarshal(b, &t2)if err == nil {fmt.Println(t2)}
解析到interface
演示代码如下
func main() {t1 := IT{"itcast", []string{"Go", "C++"}, true, 666.66}b, err := json.MarshalIndent(t1, "", " ")if err == nil {fmt.Println(string(b))}var t interface{}err = json.Unmarshal(b, &t)m, ok := t.(map[string]interface{})if ok == true {for k, v := range m {fmt.Println(k, v)}}
}
上面代码的逻辑也很简单 我们使用了一个任意类型t来接受 json中的格式
最后我们使用一个类型断言来判断t的类型 如果断言成功 那么我们的m就会变成 map[string]interface{} 之后我们对于该类型进行遍历即可
文件操作
相关api介绍
建立和打开文件
建立文件
新建文件可以通过如下两个方法
func Create(name string) (file *File, err Error)
上面的函数会根据文件名创建一个新的文件 返回一个文件对象 创建文件的默认权限为0666 如果说对于权限不理解的同学可以参考我的这篇博客 Linux权限
返回的文件对象是可读写的
func NewFile(fd uintptr, name string) *File
根据文件描述符创建文件 返回一个文件对象
打开文件
我们可以通过下面两种方式打开一个文件
func Open(name string) (file *File, err Error)
我们可以通过Open函数+文件名的方式打开一个文件 但是此时的权限会变为只读 内部实现其实调用了Openfile
func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
打开名称为name的文件 flag是打开方式 如只读 只写等 perm是权限
这里需要注意的是 如果文件已经创建 那么perm只能截断权限 而不能扩大权限
关闭文件
func (file *File) Close()
写文件
写文件主要是通过下面几个函数实现
func (file *File) Write(b []byte) (n int, err Error) // 写入byte类型的数据到文件
func (file *File) WriteAt(b []byte, off int64) (n int, err Error) // 从 off位置开始写入byte类型的数据到文件
func (file *File) WriteString(s string) (ret int, err Error) // 写入string类型的数据到文件
读文件
读文件主要是通过下面几个函数实现
func (file *File) Read(b []byte) (n int, err Error) // 读取数据到b中
func (file *File) ReadAt(b []byte, off int64) (n int, err Error) // 从off位置开始读取数据到b中
删除文件
func Remove(name string) Error // 调用函数就是删除名字为string的文件
示例代码
写文件
func main() {fout, err := os.Create("test.txt")if err != nil {fmt.Println(err)} // errordefer fout.Close() // main函数结束前关闭文件for i := 0; i < 5; i++ {outstr := fmt.Sprintf("%s : %d\n", "hello go", i)fout.WriteString(outstr)fout.Write([]byte("abcd\n"))}
}
上面这段代码运行完毕之后我们就会在当前路径下创建一个 test.txt 文档 文档内容如下

读文件
fin, err := os.Open("test.txt")if err != nil {fmt.Println(err)} // errordefer fin.Close()b1 := make([]byte, 100, 200)fin.Read(b1)fmt.Println(string(b1))
拷贝文件
需求如下
- 用户使用程序时输入两个命令行参数
- 我们规定 第一个是源文件 第二个是拷贝文件
- 我们要将源文件中的数据全部拷贝到拷贝文件中
代码表示如下
func main() {args := os.Argsif args == nil || len(args) < 2 {fmt.Println("error ! need more para")return}src := args[1]desc := args[2]// fmt.Println(src, desc)fmt.Println(src, desc)fout, err1 := os.Open(src)// 下面的代码作用是打开两个文件if err1 != nil {fmt.Println(err1)return}defer fout.Close()// 这里无法写入是因为Open打开文件是只读// fin, err2 := os.Open(desc)fin, err2 := os.OpenFile(desc, os.O_WRONLY, 0666)if err2 != nil {fmt.Println(err2)return}defer fin.Close()b1 := make([]byte, 100, 200)n, _ := fout.Read(b1)fin.Write(b1[:n])fmt.Println("程序运行成功")
}
如何在IDE中设置命令行参数
我们可以右键文件 选择修改文件配置选项

之后在程序实参中选择即可 注意 不需要加 -
相关文章:
【Hello Go】Go语言文本文件处理
文本文件处理 字符串处理字符串操作ContainsJoinindexrepeatReplaceSplitTrimFields 字符串转换AppendFormatParse 正则表达式Json处理编码Json通过结构体生产Json通过map生产json 解码Json解析到结构体解析到interface 文件操作相关api介绍建立和打开文件关闭文件写文件读文件…...
ppt录屏制作微课,轻松打造精品课程
微课作为一种新型的教学方式逐渐受到广大师生的欢迎。微课具有方便快捷、内容丰富、互动性强等特点,可以有效地帮助教师传达知识,提高学生的学习效果。其中,ppt录屏制作微课就是一种常见的方式。本文将介绍ppt录屏的使用方法,帮助…...
php伪随机数
利用工具 php_mt_seed <?php // php 7.2function white_list() {return mt_rand();}echo white_list(), "\n";echo white_list(), "\n";echo white_list(), "\n"; 输入命令: ./php_mt_seed 1035656029 <?phpmt_srand(181095…...
为什么录屏没声音?实用技巧大放送!
录屏已成为我们在数字时代记录和分享内容的重要方式之一。但有时,您可能会遇到录制视频却没有声音的问题。这个问题可能出现在不同的录屏软件中,导致许多人感到疑惑。在本文中,我们将探讨为什么录屏没声音,并提供两种解决方案&…...
分布式系统的认证授权
一.分布式系统的认证授权大致架构 以云音乐系统为例: 注:一般情况下,我们会把认证的部分的接口提取为一个单独的认证服务模块中。 二.单点登录(Single Sign On) 单点登录,Single Sign On,简称…...
TVS瞬态抑制二极管的工作原理和特点?|深圳比创达电子EMC
TVS二极管一般是用来防止端口瞬间的电压冲击造成后级电路的损坏。防止端口瞬间的电压冲击造成后级电路的损坏。有单向与双向之分,单向TVS一般应用于直流供电电路,双向TVS应用于交流供电电路。 TVS产品的额定瞬态功率应大于电路中可能出现的最大瞬态浪涌…...
csdn - mermaid
目录 方向节点样式形状箭头 子图流程图类图uml图甘特图 https://blog.csdn.net/sandalphon4869/article/details/89341443 https://blog.csdn.net/swinfans/article/details/89393853 https://zhuanlan.zhihu.com/p/614018391 https://blog.csdn.net/qq_42491125/article/detai…...
C题目11:数组a[m]排序
每日小语 双手,且放下一切劳作,前额,也忘掉忧思,此时此刻我所有的感觉就想沉入安睡。 自己敲写 这个问题老师上课讲了一种方法,叫做冒泡排序。基本思想是 1.找最小值,放到a[0] 2.从a[1]~a[3]找最小值&a…...
编译器安全
在供应链安全中,大家一直关注采用SCA工具分析开源组件中的安全漏洞以及许可证的合规性。但是对于底层软件开发使用的编译器、链接器等安全却容易被忽视,其中有没有安全漏洞、有没有运行时缺陷、有没有被植入漏洞、木马等,似乎并没有引起多少人…...
docker部署gitlab 12.10.6过程
docker部署gitlab 12.10.6过程 1.docker安装 docker指定版本安装【官方文档步骤】 官方文档地址:https://docs.docker.com/engine/install/centos/ # 1.安装yum工具及设置docker-ce镜像库 sudo yum install -y yum-utils# 国外的镜像下载太慢了改成阿里云镜像库 s…...
单例设计模式是什么?什么是 Singleton 单例设计模式?Python 单例(单件)设计模式示例代码
什么是 Singleton 单例设计模式? 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。 主要思想: 单例模式确保某个类只有一个实例,并提供了一个访问该实例的全局访问点。它…...
Redis跳跃表
前言 跳跃表(skiplist)是一种有序数据结构,它通过在每一个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持平均O(logN),最坏O(N),复杂度的节点查找,还可以通过顺序性来批量处理节点…...
C++基础从0到1入门编程(二)
系统学习C 方便自己日后复习,错误的地方希望积极指正 往期文章:C基础从0到1入门编程(一) 参考视频: 1.黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 2.系统化学习C 1 函数指针和回调函数 如果把函数的地址…...
Uniapp扫码预览连接地址与手机不在同一网段
在开发Uniapp应用时,这里有一个扫码预览的功能,电脑与手机都是在一网络下,之前点开后预览地址一直是169.254.3.x的地址,通过WINR键输入cmd运行,然后ipconfig查看所有网络连接。发现有一个虚拟网络连接的地址是169.251.…...
万界星空科技SMT行业生产管理MES系统解决方案
一、SMT行业特点: SMT(Surface Mounted Technology)作为电子组装行业里首先的技术和工艺,选择合适的MES解决方案来保障SMT生产的成功至关重要。 电子行业涉及的范围非常广,包含了汽车、电脑、电视、手机等产品上&…...
vue3 uniapp h5 安卓和iOS开发适配踩坑记录
font-size适配屏幕大小及iOS和安卓状态栏及安全距离的处理 App.vue <script setup lang"ts"> import { onLaunch, onShow, onHide } from "dcloudio/uni-app"; import ./main.scss onLaunch(() > {console.log("App Launch");var wid…...
inf和nan
在某些编程语法中inf表示无穷大,nan表示不是一个数(not a number) nan表示这个数不确定,而无穷大表示这个数任意大 1/0inf 这里把0当做一个无限接近0,但是非0的数 5-inf-inf 一个数减去无穷大会等于负无穷大 而inf-infnan 因为两个无穷大相减有很多可能,可能等于一个常数,也可能…...
十. Linux关机重启命令与Vim编辑的使用
关机重启命令 shutdown命令 其他关机命令 其他重启命令 系统运行级别 系统默认运行级别与查询 退出登录命令logout 文本编辑器Vim Vim简介 没有菜单,只有命令Vim工作模式 Vim常用命令 插入命令 定位命令 删除命令 复制和剪切命令 替换和取消命令 搜索和搜索替换命令 保存和退出…...
Spring-IOC-@Value和@PropertySource用法
1、Book.java PropertySource(value"classpath:配置文件地址") 替代 <context:property-placeholder location"配置文件地址"/> Value("${book.bid}") Value("${book.bname}") Value("${book.price}") <bean id&…...
如何理解Python中一切皆对象?
Python 一、示例代码二、Python中的魔法方法 一、示例代码 有理数类 import mathclass rational:def __init__(self,p,q):self.p pself.q qdef __str__(self):return "{} / {}".format(self.p,self.q)def simplify(self):gcd math.gcd(self.p,self.q)return rat…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
