1. 程式人生 > 其它 >08 檔案操作及JSON格式轉換

08 檔案操作及JSON格式轉換

文章目錄

檔案操作

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字串轉換為對應的資料結構
注意點

  1. 對於結構體的序列化,如果希望序列化後,欄位的名字由我們重新定製,可以在結構體中定義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
}