贵州二级站seo整站优化排名,无锡网站制作服务,二环建设部网站,自己做影视会员网站#x1f381;个人主页#xff1a;星云爱编程 #x1f50d;所属专栏#xff1a;【Go】 #x1f389;欢迎大家点赞#x1f44d;评论#x1f4dd;收藏⭐文章 长风破浪会有时#xff0c;直挂云帆济沧海 目录
1.文件操作
1.1文件介绍
1.2.文件流
1.3.打开和关闭文件
1… 个人主页星云爱编程 所属专栏【Go】 欢迎大家点赞评论收藏⭐文章 长风破浪会有时直挂云帆济沧海 目录
1.文件操作
1.1文件介绍
1.2.文件流
1.3.打开和关闭文件
1.4.读文件操作
1.5.写文件操作
1.6判断文件是否存在
1.7拷贝文件
2.flag解析命令行参数
2.1.命令行参数基本使用
2.2flag包解析命令行参数 2.3flag包处理命令行参数
3.json处理
3.1JSON介绍
3.2Json数据格式说明
3.3JSON序列化
3.4JSON反序列化
结语 1.文件操作
1.1文件介绍
文件是保存数据的地方例如word文档、txt文本文件excel文件等都是文件。文件能保存图片视屏音频等。
1.2.文件流
文件在程序中是以流的形式来操作的 流数据在数据源文件和程序内存之间经历的路程。
输入流数据从数据源文件到程序内存的路径。
输出流数据从程序内存到数据源文件的路径。
1.3.打开和关闭文件
打开文件用到的方法
1默认文件模式 2 可指定文件模式 其flag可为的常量
const (O_RDONLY int syscall.O_RDONLY // 只读模式打开文件O_WRONLY int syscall.O_WRONLY // 只写模式打开文件O_RDWR int syscall.O_RDWR // 读写模式打开文件O_APPEND int syscall.O_APPEND // 写操作时将数据附加到文件尾部O_CREATE int syscall.O_CREAT // 如果不存在将创建一个新文件O_EXCL int syscall.O_EXCL // 和O_CREATE配合使用文件必须不存在O_SYNC int syscall.O_SYNC // 打开文件用于同步I/OO_TRUNC int syscall.O_TRUNC // 如果可能打开时清空文件
) 关闭文件用到的方法 使用案例
package main
import (fmtos
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/a.txt//打开文件file ,err:os.Open(path)if err!nil{//打开失败fmt.Printf(open err:%v\n,err)}//输出文件看看会输出什么fmt.Printf(%v,file)//{0xc00008c6c8}errfile.Close()if err!nil{//关闭失败fmt.Printf(close err:%v\n,err)}
}
说明
Open方法和Close方法都在os包下使用时要导入os包file就是个指针
1.4.读文件操作
1带缓冲读文件
package main
import (fmtosbufioio
)func main(){path:D:/goProject/src/basic/io/main/text/a.txtfile ,err:os.Open(path)if err!nil{//打开失败fmt.Printf(open err:%v\n,err)}defer file.Close()// 创建一个 *Reader是带缓冲的/*const(defaultBufsize 4096 //默认的缓冲区为4096)*/readr:bufio.NewReader(file)//循环的读取文件的内容for{str,err:readr.ReadString(\n)//读取到\n就结束,即一行一行的读if errio.EOF{//io.EOF表示文件的末尾break}//输出内容fmt.Print(str)}fmt.Println(\n文件读取结束)
}
2一次性读文件 案例
package main
import(fmtio/ioutil
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/a.txt//一次性读取文件content,err:ioutil.ReadFile(path)if err!nil{fmt.Println(read err:,err)}// fmt.Println(content) 此时输出的是byte[],得用string转化才能输出原内容 fmt.Println(string(content))//我们没有显式的open文件因此也不需要显式的close文件//因为文件的open和close被封装到 ReadFile 函数内部
}
1.5.写文件操作
1创建新文件并写入数据
package main
import (fmtosbufio
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/b.txt//打开文件file,err:os.OpenFile(path,os.O_WRONLY | os.O_CREATE,0666)if err!nil{fmt.Println(open err:,err)return}//最后关闭file文件defer file.Close()//写入内容str:好好学习天天向上//用带缓存的*writer写入writer:bufio.NewWriter(file)for i:0;i5;i{writer.WriteString(str)writer.WriteString(\n) // 添加换行}//因为writer是带缓存的因此在调用WriteString时//是先将内容写入到缓存中所以需要用Flush方法//将缓存的数据真正的写入到文件中否则文件中会没有数据writer.Flush()fmt.Println(写入完成)
}
2打开原有文件将原内容覆盖写入
package main
import (fmtosbufio
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/b.txt//打开原有文件file,err:os.OpenFile(path,os.O_WRONLY | os.O_TRUNC,0666)if err!nil{fmt.Println(open err:,err)return}//最后关闭file文件defer file.Close()//写入内容str:温故而知新可以为师矣//用带缓存的*writer写入writer:bufio.NewWriter(file)for i:0;i5;i{writer.WriteString(str) writer.WriteString(\n) // 添加换行}//因为writer是带缓存的因此在调用WriteString时//是先将内容写入到缓存中所以需要用Flush方法//将缓存的数据真正的写入到文件中否则文件中会没有数据writer.Flush()fmt.Println(写入完成)
} 3打开原有文件在原文件上追加写入
package main
import (fmtosbufio
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/b.txt//打开原有文件file,err:os.OpenFile(path,os.O_WRONLY | os.O_APPEND,0666)if err!nil{fmt.Println(open err:,err)return}//最后关闭file文件defer file.Close()//写入内容str:实迷途其未远觉今是而昨非//用带缓存的*writer写入writer:bufio.NewWriter(file)for i:0;i5;i{writer.WriteString(str) writer.WriteString(\n) // 添加换行}//因为writer是带缓存的因此在调用WriteString时//是先将内容写入到缓存中所以需要用Flush方法//将缓存的数据真正的写入到文件中否则文件中会没有数据writer.Flush()fmt.Println(写入完成)
} 4打开原有文件并进行读和写操作
package main
import (fmtosbufioio
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/b.txt//打开原有文件file,err:os.OpenFile(path,os.O_RDWR | os.O_APPEND,0666)if err!nil{fmt.Println(open err:,err)return}//最后关闭file文件defer file.Close()//读操作reader:bufio.NewReader(file)for{str1,err:reader.ReadString(\n)if errio.EOF{break}fmt.Print(str1)}//写操作//写入内容str:故有之以为用无之以为利//用带缓存的*writer写入writer:bufio.NewWriter(file)for i:0;i5;i{writer.WriteString(str) writer.WriteString(\n) // 添加换行}//因为writer是带缓存的因此在调用WriteString时//是先将内容写入到缓存中所以需要用Flush方法//将缓存的数据真正的写入到文件中否则文件中会没有数据writer.Flush()fmt.Println(写入完成)
}
1.6判断文件是否存在
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:
如果返回的错误为nil,说明文件或文件夹存在如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在如果返回的错误为其它类型,则不确定是否在存在
package main
import (fmtosbufio
)func main(){//文件路径path:D:/goProject/src/basic/io/main/text/b.txt// 检查文件是否存在if _, err : os.Stat(path); os.IsNotExist(err) {fmt.Println(文件不存在将创建新文件)} else if err ! nil {fmt.Println(检查文件出错:, err)return} else {fmt.Println(文件已存在将追加内容)}
}
1.7拷贝文件
package main
import (fmtosio
)func CopyFile(srcPath, destPath string)(written int64, err error){// 打开源文件src, err : os.Open(srcPath)if err ! nil{return 0, fmt.Errorf(打开源文件错误: %v, err)}defer src.Close()// 创建目标文件dest, err : os.Create(destPath)if err ! nil{return 0, fmt.Errorf(创建目标文件错误: %v, err)}defer dest.Close()// 复制文件内容return io.Copy(dest, src)
}func main(){srcPath : D:\\goProject\\src\\basic\\io\\main\\c.jpgdestPath : D:\\goProject\\src\\basic\\io\\main\\text\\copy.jpgwritten, err : CopyFile(srcPath, destPath)if err ! nil {fmt.Println(复制失败:, err)return}fmt.Printf(成功复制 %d 字节\n, written)
}
2.flag解析命令行参数
2.1.命令行参数基本使用
package main
import (fmtos
)func main(){fmt.Println(命令行参数有,len(os.Args))//遍历命令行参数for i,v:range os.Args{fmt.Printf(args[%v]%v\n,i,v)}}
2.2flag包解析命令行参数
前面的方式是比较原生的方式对解析参数不是特别的方便特别是带有指定参数形式的命令行
Go提供了flag包可以方便的解析命令行参数并且参数顺序可以随意
package main
import(fmtflag
)func main(){//定义几个变量用于接受命令行的参数值var user stringvar pwd stringvar host stringvar port int//此例子用于mysql的连接/*func (f *FlagSet) StringVar(p *string, name string, value string, usage string)String用指定的名称、默认值、使用信息注册一个string类型flag。返回一个保存了该flag的值的指针。*/// u就是-u指定参数// 为-u指定参数的默认值//用户名默认为空 -说明flag.StringVar(user,u,,用户名默认为空)flag.StringVar(pwd,pwd,,密码默认为空)flag.StringVar(host,h,localhost,主机名默认为localhost)flag.IntVar(port,port,3306,端口号默认为3306)//这里有一个非常重要的操作转换必须调用该方法flag.Parse()//输出结果fmt.Printf( user%v\n pwd%v\n host%v\n port%v\n,user,pwd,host,port)
} 2.3flag包处理命令行参数
package mainimport (flagfmt
)func main() {// 定义命令行参数name : flag.String(name, Guest, 用户姓名)age : flag.Int(age, 18, 用户年龄)verbose : flag.Bool(v, false, 是否显示详细信息)// 解析命令行参数flag.Parse()// 使用解析后的参数fmt.Printf(姓名: %s\n, *name)fmt.Printf(年龄: %d\n, *age)if *verbose {fmt.Println(显示详细信息)}
}
说明
1定义参数: flag.String() 定义字符串类型参数flag.Int() 定义整数类型参数flag.Bool() 定义布尔类型参数
2参数解析
flag.Parse() 解析命令行参数
3使用参数
通过 * 解引用获取参数值 3.json处理
3.1JSON介绍
JSONJavaScript Object Notation是一种轻量级的数据交换格式易于人阅读和编写同时也易于机器解析和生成
JSON是在2001年开始推广使用的数据格式目前已经成为主流的数据格式。
JSON易于机器解析和生成并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。
3.2Json数据格式说明
在JS语言中一切都是对象因此任何的数据类型都可以通过JSON来表示
JSON键值对是用来保存数据的一种方式键值对组合中的键名写在前面并用双引号包裹使用冒号:分隔然后紧接着值
基本结构
1对象用 {} 表示包含键值对
{name: Alice,age: 25
}
2数组用 [] 表示包含多个值
[apple, banana, orange]
3值 可以是字符串、数字、布尔值、null、对象或数组 JSON在线解析 JSON在线解析
3.3JSON序列化
JSON序列化是将对应的数据结构例如struct,map,slice转换为JSON格式字符串的过程。
案例
package main
import(fmtencoding/json
)type Stu struct{Name stringAge intGender stringScore float64Phone string
}
//将结构体序列化
func testStruct(){stu:Stu{Name:jack,Age: 12,Gender: 男,Score:85.6,Phone:1581689988,}//将stu序列化data,err:json.Marshal(stu)if err!nil{panic(err)}//输出序列化后的结果fmt.Println(string(data))//{Name:jack,Age:12,Gender:男,Score:85.6,Phone:1581689988}
}//将map序列化
func testMap(){//定义一个mapvar a map[string]interface{}//使用map前,需要makea make(map[string]interface{})a[name]李星云a[age]21a[skill]九幽玄天神功a[lover]姬如雪a[address]长安//将a序列化data,err:json.Marshal(a)if err!nil{panic(err)}//输出序列化的结果fmt.Println(string(data))//{address:长安,age:21,lover:姬如雪,name:李星云,skill:九幽玄天神功}}//对切片序列化
func testSlice(){var slice []map[string]interface{}var a map[string]interface{}//使用map前,需要makea make(map[string]interface{})a[name]李星云a[age]21a[skill]九幽玄天神功a[lover]姬如雪a[address]长安var b map[string]interface{}//使用map前,需要makeb make(map[string]interface{})b[name]姬如雪b[age]19b[skill]幻音诀b[lover]李星云b[address]幻音坊//将a,b添加到slice中sliceappend(slice,a)sliceappend(slice,b)//将切片进行序列化操作data,err:json.Marshal(slice)if err!nil{panic(err)}//输出序列化结果fmt.Println(string(data))//[{address:长安,age:21,lover:姬如雪,name:李星云,skill:九幽玄天神功},{address:幻音坊,age:19,lover:李星云,name:姬如雪,skill:幻音诀}]
}//对基本数据类型进行序列化
//对基本数据类型进行序列化意义不大
func testFloat64(){var num float643.1415926535//对num进行序列化data,err:json.Marshal(num)if err!nil{panic(err)}//输出序列化后的结果fmt.Println(string(data))
}func main(){testStruct()testMap()testSlice()testFloat64()
}
注意事项
结构体字段首字母必须大写否则无法被序列化若想让序列化后的结构体字段首字母小写可以使用tag标签可以使用 json:,omitempty 标签来忽略空值字段可以使用 json:- 标签来忽略某个字段
3.4JSON反序列化
JSON反序列化是将JSON格式字符串转换为对应的数据结构例如struct,map,slice的过程
package main
import(fmtencoding/json
)type Stu struct{Name stringAge intGender stringScore float64Phone string
}//演示将json字符串反序列化为struct
func unmarshalStruct(){str:{\Name\:\jack\,\Age\:12,\Gender\:\男\,\Score\:85.6,\Phone\:\1581689988\}//定义一个Stu实例var stu Stuerr:json.Unmarshal([]byte(str),stu)if err!nil{panic(err)}//输出反序列化后的strfmt.Println(stu)
}//演示将json字符串反序列化为map
func unmarshalMap(){str:{address:长安,age:21,lover:姬如雪,name:李星云,skill:九幽玄天神功}//定义一个map实例var a map[string]interface{}err:json.Unmarshal([]byte(str),a)if err!nil{panic(err)}//输出反序列化后的strfmt.Println(a)
}//演示将json字符串反序列化为slice
func unmarshalSlice(){str:[{address:长安,age:21,lover:姬如雪,name:李星云,skill:九幽玄天神功},{address:幻音坊,age:19,lover:李星云,name:姬如雪,skill:幻音诀}]//定义一个slice实例var slice []map[string]interface{}//进行反序列化err:json.Unmarshal([]byte(str),slice)if err!nil{panic(err)}//输出反序列化后的结果fmt.Println(slice)
}func main(){unmarshalStruct()unmarshalMap()unmarshalSlice()
}
说明
1在反序列化一个json字符串时要确保反序列化后的数据类型和原来序列化前的数据类型一致。
2如果json字符串是通过程序获取到的则不需要再对进行转义处理
结语
感谢您的耐心阅读希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值不妨动动手指给个赞让更多的朋友看到。同时点击关注不错过我们的每一次精彩分享。若想随时回顾这些知识点别忘了收藏⭐让知识触手可及。您的支持是我们前进的动力期待与您在下一次分享中相遇