Go语言核心编程之文件操作及命令行参数获取

    科技2022-08-03  114

    文件-基本介绍

    文件在程序中是以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径

    注:os.File封装所有文件相关操作,File是一个结构体。

    常用的文件操作函数和方法

    1)打开一个文件进行读操作: os.Open(name string)(*File,error) 2)关闭一个文件: File.Close()

    读文件操作应用案例

    1)读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法; 2)读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况,相关方法和函数:ioutil.ReadFile

    写文件操作应用案例

    基本介绍:

    func OpenFile(name string,flag int,perm FileMode)(file *File,err error)

    说明:os.OpenFile是一个更一般性的文件打开函数,它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O;如果出错,错误底层类型是*PathError。

    判断文件是否存在

    golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断: 1)如果返回的错误为nil,说明文件或文件夹存在 2)如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在 3)如果返回的错误为其它类型,则不确定是否存在

    func PathExists(path string)(bool,error){ _,err := os.Stat(path) if err == nil{ return true,nil } if os.IsNotExist(err){ return false,nil } return false,err }
    文件拷贝
    func CopyFile(dstFileName string,srcFileName string)(written int64,err error){ srcFile,err := os.Open(srcFileName) if err!=nil{ fmt.Printf("open file err=%v\n",err) } defer stcFile.Close() reader := bufio.NewReader(srcFile) dstFile,err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE,0666if err!=nil{ fmt.Printf("open file err=%v\n,err) return } writer := bufio.NewWriter(dstFile) defer dstFile.Close() return io.Copy(writer,reader) }
    命令行参数

    os.Args是一个string切片,用来存储所有的命令行参数 flag包用来解析命令行参数: 说明:前面的方式是比较原生的方式,对解析参数不是特别方便,特别是带有指定参数形式的命令行。 比如:cmd>main.exe -f c:/aaa.txt -p 200 -u root这样形式的命令行,go设计者给我们提供了flag包,可以方便的解析命令行参数,而且参数顺序可以随意。

    func main(){ var user string var pwd string var host string var port string //&user就是接收用户命令行中输入的-u 后面的参数值 //""默认值 flag.StringVar(&user,"u","","用户名,默认为空") flag.StringVar(&pwd,"pwd","","密码,默认为空") flag.StringVar(&host,"h","localhost","主机名,默认为localhost") flag.StringVar(&port,"port",3306,"端口号,默认为3306") flag.Parse() fmt.Prinf("user=%v pwd=%v host=%v port=%v",user,pwd,host,port) }

    命令行输入: go build -o test.exe main.go-> test.exe -u root -pwd 123456 -h 127.0.0.1 -port 8080

    json基本介绍

    概述:JSON是一种轻量级的数据交换模式,易于人阅读和编写,同时也易于机器解析和生成。 JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。 JSON易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。

    json数据格式说明

    在JS语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。 JSON键值对是用来保存数据的一种方式,键值对组合中的键名写在前面并用双引号“”包裹,使用冒号:分隔,然后紧接着值: 比如: {“firstName”:“JSON”} {“name”:“tom”,“age”:18,“address”:[“北京”,“上海”]}

    json序列化
    package main import ( "fmt" "encoding/json" ) type Monster struct{ Name string //`json:"monster_name"` //反射机制 Age int Birthday string Sal float64 Skill string } func testStruct() { monster := Monster{ Name:"牛魔王" , Age:500, Birthday:"2011-11-11", Sal:8000.0, Skill:"牛魔拳", } //序列化 data,err := json.Marshal(&monster) if err != nil{ fmt.Println("序列化失败%v",err) } fmt.Printf("序列化后monster:%v",data) fmt.Printf("序列化后monster:%v",string(data)) } //将map序列化 func testMap() { var a map[string]interface{} a = make(map[string]interface{}) a["name"] = "红孩儿" a["age"] = 30 //序列化 data,err := json.Marshal(a) if err != nil{ fmt.Println("序列化失败%v",err) } fmt.Printf("序列化后monster:%v",string(data)) } //对切片进行序列化 func testSlice() { var slice []map[string]interface{} var m1 map[string]interface{} m1 = make(map[string]interface{}) m1["name"] = "jack" m1["age"] = 7 slice = append(slice,m1) var m2 map[string]interface{} m2 = make(map[string]interface{}) m2["name"] = "tom" m2["age"] = 10 slice = append(slice,m2) data,err := json.Marshal(slice) if err != nil{ fmt.Println("序列化失败%v",err) } fmt.Printf("序列化后monster:%v",string(data)) } func main() { //将结构体、map、切片进行序列化 // testStruct() // //testMap() testSlice() }
    json反序列化
    package main import ( "fmt" "encoding/json" ) type Monster struct{ Name string //`json:"monster_name"` //反射机制 Age int Birthday string Sal float64 Skill string } //将json字符串反序列化为结构体类型 func structUnserialize() { str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}" var monster Monster err := json.Unmarshal([]byte(str),&monster) if err != nil{ fmt.Println("反序列化失败..") } fmt.Println(monster) } //将json字符串反序列化为切片类型 func sliceUnserialize(){ str := "[{\"age\":7,\"name\":\"jack\"},{\"age\":10,\"name\":\"tom\"}]" var slice []map[string]interface{} err := json.Unmarshal([]byte(str),&slice) if err!=nil{ fmt.Println("反序列化失败") } fmt.Println(slice) } func main() { structUnserialize() sliceUnserialize() }
    Processed: 0.012, SQL: 8