文件-基本介绍
文件在程序中是以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径
注: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
,0666)
if 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
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
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
))
}
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() {
testSlice()
}
json反序列化
package main
import (
"fmt"
"encoding/json"
)
type Monster
struct{
Name
string
Age
int
Birthday
string
Sal
float64
Skill
string
}
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
)
}
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()
}