08 檔案操作及JSON格式轉換
阿新 • • 發佈:2021-03-29
文章目錄
檔案操作
os.File 封裝所有檔案相關操作,File是一個結構體
訪問檔案
func Open (name string)(file *File ,err error)
開啟一個檔案用於後續操作,操作成功則返回檔案物件,否則返回異常資訊
fun (f *File) Close () error
關閉檔案使檔案不能讀寫, 返回可能出現錯誤。
func OpenFile(name string,flag int,perm fileMode)(file *File,err error)
開啟檔案函式,使用指定的選項、指定的模式開啟指定的檔案。
flag取值如下:
fileMode 引數取值:同linux檔案許可權控制,0666 表示 讀寫
func Copy(dst Writer,src Reader)(written int64,err error)
檔案複製
讀檔案程式碼
func test01(){
//開啟檔案
file,err := os.Open("C:\\E\\goworks\\src\\go04\\file\\test01.txt")
if err!= nil {
fmt.Println("open file err",err)
return
}
//fmt.Printf("file=v% \n",file)
//讀取檔案內容
reader := bufio.NewReader(file)
for{
str,err := reader.ReadString('\n')//讀到一個換行就結束
fmt.Println(str)
if err == io.EOF{
break
}
}
err = file.Close()//關閉檔案
if err!= nil{
fmt.Println("close file err",err)
return
}
}
寫檔案程式碼
//檔案寫入
func test02(){
//開啟檔案
filePath :="C:\\E\\goworks\\src\\go04\\file\\test02.txt"
file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
if err!= nil {
fmt.Println("open file err",err)
return
}
defer file.Close()
//fmt.Printf("file=v% \n",file)
//讀取檔案內容
writer := bufio.NewWriter(file)
for i:=0;i<5;i++{
writer.WriteString("nihao\n")
}
//writer 是寫快取,因此寫完後必須呼叫Flush 方法,將快取資料持久化
writer.Flush()
}
檔案複製
//檔案複製
func CopyFile(dstFileName string,srcFileName string)(written int64,err error){
srcFile,err:=os.Open(srcFileName)
if(err != nil){
fmt.Println("開啟檔案異常",err)
return
}
//if()
disFile,err:=os.OpenFile(dstFileName,os.O_WRONLY|os.O_CREATE,0666)
if(err != nil){
fmt.Println("開啟檔案異常",err)
return
}
defer srcFile.Close()
defer disFile.Close()
reader := bufio.NewReader(srcFile)
writer:=bufio.NewWriter(disFile)
return io.Copy(writer,reader)
}
檔案是否存在
//判斷檔案是否存在
func PathExists(path string)(bool,error){
_,err := os.Stat(path)
//如果os.Stat 方法未返回異常 則 表示目錄存在
if err==nil{
return true,nil
}
//如果 返回了異常 判斷 os.IsNotExist 返回true
//表示目錄不存在
if os.IsNotExist(err){
return false,nil
}
//其他情況不確定是否存在
return false,err
}
JSON格式轉換
javascript Object notation 是一種輕量級的資料交換格式。目前已經成為主力的資料格式。json格式字串與資料結構的相互轉換時個語言的標準。
序列化:將符合條件的資料結構轉換為JSON字串
反序列化:反序列化是指 將json字串轉換為對應的資料結構
注意點
- 對於結構體的序列化,如果希望序列化後,欄位的名字由我們重新定製,可以在結構體中定義tag標籤。
示例程式碼
func test05(){
mon :=Monster{
Name:"牛魔王",
Age:100,
Skill:"必殺技",
}
//序列化
data,_:=json.Marshal(&mon)
//{"Name":"牛魔王","MonsterAge":100,"Skill":"必殺技"}
fmt.Println(string(data))
//反序列化
var a Monster ;
json.Unmarshal(data,&a)
fmt.Println("struct反序列化結果:",a)
//map 序列化
map1 := map[string] interface{}{
"name":"tom",
"age":18,
"skill":"bisha",
}
data,_ =json.Marshal(map1)
fmt.Println(string(data))//{"age":18,"name":"tom","skill":"bisha"}
//反序列化
var b map[string] interface{}
json.Unmarshal(data,&b)
fmt.Println("map反序列化結果:",b)
//切片序列化
var sli []map[string]interface{}
var m1 map[string]interface{}
m1 = make(map[string]interface{})
m1["name"]="tom"
m1["age"]=19
m1["skill"]="haha"
sli=append(sli,m1)
data,_ = json.Marshal(sli)
//[{"age":19,"name":"tom","skill":"haha"}]
fmt.Println(string(data))
//反序列化
var c []map[string]interface{}
json.Unmarshal(data,&c)
fmt.Println("map反序列化結果:",c)
//基本型別序列化
data,_ = json.Marshal(18)
fmt.Println(string(data))//18
}