Golang的文件處理方式-常見的讀寫姿勢
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
在 Golang 語言中,文件使用指向 os.File 類型的指針來表示的,也叫做文件句柄。注意,標准輸入 os.Stdin 和標准輸出 os.Stdout ,他們的類型都是 *os.File 喲。在任何計算機設備中,文件是都是必須的對象,而在 Web編程中,文件的操作一直是 Web程序員經常遇到的問題,文件操作在 Web應用中是必須的,非常有用的,我們經常遇到生成文件目錄,文件(夾)編輯等操作。
一.文件的讀取姿勢

1 歌曲:我有一只小毛驢 2 歌手:碧瑤 3 專輯:《瑤謠搖》 4 發行時間:2014-03-18 5 詞:付林 6 曲:付林 7 歌詞: 8 我有一只小毛驢 9 我從來也不騎 10 有一天我心血來潮騎着去趕集 11 我手里拿着小皮鞭 12 我心里很得意 13 不知怎么嘩啦啦啦啦 14 摔了一身泥 15 我有一只小毛驢 16 我從來也不騎 17 有一天我心血來潮騎着去趕集 18 我手里拿着小皮鞭 19 我心里很得意 20 不知怎么嘩啦啦啦啦 21 摔了一身泥 22 我有一只小毛驢 我從來也不騎 23 有一天我心血來潮 騎着去趕集 24 我手里拿着小皮鞭 我心里很得意 25 不知怎么嘩啦啦啦 摔了一身泥 26 我有一只小毛驢 我從來也不騎 27 有一天我心血來潮 騎着去趕集 28 我手里拿着小皮鞭 我心里很得意 29 不知怎么嘩啦啦啦 摔了一身泥 30 我手里拿着小皮鞭 我心里很得意 31 不知怎么嘩啦啦啦 摔了一身泥
姿勢1.順序讀取文件內容
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "bufio" 12 "fmt" 13 "io" 14 "os" 15 ) 16 17 var ( 18 FileName string = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.txt" //這是我們需要打開的文件,當然你也可以把它定義到從某個配置文件來獲取變量。 19 InputFile *os.File //變量 InputFile 是 *os.File 類型的。該類型是一個結構,表示一個打開文件的描述符(文件句柄)。 20 InputError error //我們使用 os 包里的 Open 函數來打開一個文件。如果文件不存在或者程序沒有足夠的權限打開這個文件,Open函數會返回一個錯誤,InputError變量就是用來接收這個錯誤的。 21 Count int //這個變量是我們用來統計行號的,默認值為0. 22 ) 23 24 func main() { 25 //InputFile,InputError = os.OpenFile(FileName,os.O_CREATE|os.O_RDWR,0644) //打開FileName文件,如果不存在就創建新文件,打開的權限是可讀可寫,權限是644。這種打開方式相對下面的打開方式權限會更大一些。 26 InputFile, InputError = os.Open(FileName) //使用 os 包里的 Open 函數來打開一個文件。該函數的參數是文件名,類型為 string 。我們以只讀模式打開"FileName"文件。 27 if InputError != nil { //如果打開文件出錯,那么我們可以給用戶一些提示,然后在推出函數。 28 fmt.Printf("An error occurred on opening the inputfile\n" + 29 "Does the file exist?\n" + 30 "Have you got acces to it?\n") 31 return // exit the function on error 32 } 33 defer InputFile.Close() //defer關鍵字是用在程序即將結束時執行的代碼,確保在程序退出前關閉該文件。 34 inputReader := bufio.NewReader(InputFile) //我們使用 bufio.NewReader()函數來獲得一個讀取器變量(讀取器)。我們可以很方便的操作相對高層的 string 對象,而避免了去操作比較底層的字節。 35 for { 36 Count += 1 37 inputString, readerError := inputReader.ReadString('\n') //我們將inputReader里面的字符串按行進行讀取。 38 if readerError == io.EOF { 39 return //如果遇到錯誤就終止循環。 40 } 41 fmt.Printf("The %d line is: %s",Count, inputString) //將文件的內容逐行(行結束符'\n')讀取出來。 42 } 43 } 44 45 46 47 #以上代碼執行結果如下: 48 The 1 line is: 歌曲:我有一只小毛驢 49 The 2 line is: 歌手:碧瑤 50 The 3 line is: 專輯:《瑤謠搖》 51 The 4 line is: 發行時間:2014-03-18 52 The 5 line is: 詞:付林 53 The 6 line is: 曲:付林 54 The 7 line is: 歌詞: 55 The 8 line is: 我有一只小毛驢 56 The 9 line is: 我從來也不騎 57 The 10 line is: 有一天我心血來潮騎着去趕集 58 The 11 line is: 我手里拿着小皮鞭 59 The 12 line is: 我心里很得意 60 The 13 line is: 不知怎么嘩啦啦啦啦 61 The 14 line is: 摔了一身泥 62 The 15 line is: 我有一只小毛驢 63 The 16 line is: 我從來也不騎 64 The 17 line is: 有一天我心血來潮騎着去趕集 65 The 18 line is: 我手里拿着小皮鞭 66 The 19 line is: 我心里很得意 67 The 20 line is: 不知怎么嘩啦啦啦啦 68 The 21 line is: 摔了一身泥 69 The 22 line is: 我有一只小毛驢 我從來也不騎 70 The 23 line is: 有一天我心血來潮 騎着去趕集 71 The 24 line is: 我手里拿着小皮鞭 我心里很得意 72 The 25 line is: 不知怎么嘩啦啦啦 摔了一身泥 73 The 26 line is: 我有一只小毛驢 我從來也不騎 74 The 27 line is: 有一天我心血來潮 騎着去趕集 75 The 28 line is: 我手里拿着小皮鞭 我心里很得意 76 The 29 line is: 不知怎么嘩啦啦啦 摔了一身泥 77 The 30 line is: 我手里拿着小皮鞭 我心里很得意
姿勢2.按列讀取數據
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "fmt" 12 "os" 13 ) 14 15 var ( 16 FileName = "E:\\Code\\Golang\\Golang_Program\\文件處理\\a.txt" 17 ) 18 19 /* 20 注意:FileName的文件內容如下: 21 A B C 22 a b c 23 1 2 3 24 */ 25 26 func main() { 27 file, err := os.Open(FileName) 28 if err != nil { 29 panic(err) 30 } 31 defer file.Close() 32 var Column1, Column2, Column3 []string //定義3個切片,每個切片用來保存不同列的數據。 33 34 for { 35 var FirstRowColumn, SecondRowColumn, ThirdRowColumn string 36 _, err := fmt.Fscanln(file, &FirstRowColumn, &SecondRowColumn, &ThirdRowColumn) //如果數據是按列排列並用空格分隔的,我們可以使用 fmt 包提供的以 FScan 開頭的一系列函數來讀取他們。 37 if err != nil { 38 break 39 } 40 Column1 = append(Column1, FirstRowColumn) //將第一列的每一行的參數追加到空切片Column1中。以下代碼類似。 41 Column2 = append(Column2, SecondRowColumn) 42 Column3 = append(Column3, ThirdRowColumn) 43 } 44 fmt.Println(Column1) 45 fmt.Println(Column2) 46 fmt.Println(Column3) 47 } 48 49 50 51 #以上代碼執行結果如下: 52 [A a 1] 53 [B b 2] 54 [C c 3]
姿勢3. 帶緩沖的讀取
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "os" 12 "bufio" 13 "io" 14 "fmt" 15 ) 16 17 var ( 18 FileName = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.txt" 19 ) 20 21 func main() { 22 f,err := os.Open(FileName) 23 if err != nil{ 24 panic(err) 25 } 26 defer f.Close() 27 ReadSize := make([]byte,1024) //指定每次讀取的大小為1024。 28 ReadByte := make([]byte,4096,4096) //指定讀取到的字節數。 29 r := bufio.NewReader(f) 30 for { 31 ActualSize,err := r.Read(ReadSize) //回返回每次讀取到的實際字節大小。 32 if err != nil && err != io.EOF { 33 panic(err) 34 } 35 if ActualSize == 0 { 36 break 37 } 38 ReadByte = append(ReadByte,ReadSize[:ActualSize]...) //將每次的讀取到的內容都追加到我們定義的切片中。 39 } 40 fmt.Println(string(ReadByte)) //打印我們讀取到的內容,注意,不能直接讀取,因為我們的切片的類型是字節,需要轉換成字符串這樣我們讀取起來會更方便。 41 }
姿勢4.將整個文件的內容讀到一個字節切片中
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "fmt" 12 "io/ioutil" 13 "os" 14 "reflect" 15 ) 16 17 var ( 18 FileName = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.txt" 19 ) 20 21 func main() { 22 buf, err := ioutil.ReadFile(FileName) //將整個文件的內容讀到一個字節切片中。 23 fmt.Println(reflect.TypeOf(buf)) 24 if err != nil { 25 fmt.Fprintf(os.Stderr, "File Error: %s\n", err) 26 // panic(err.Error()) 27 } 28 fmt.Printf("%s\n", string(buf)) 29 } 30 31 32 33 #以上代碼執行結果如下: 34 []uint8 35 歌曲:我有一只小毛驢 36 歌手:碧瑤 37 專輯:《瑤謠搖》 38 發行時間:2014-03-18 39 詞:付林 40 曲:付林 41 歌詞: 42 我有一只小毛驢 43 我從來也不騎 44 有一天我心血來潮騎着去趕集 45 我手里拿着小皮鞭 46 我心里很得意 47 不知怎么嘩啦啦啦啦 48 摔了一身泥 49 我有一只小毛驢 50 我從來也不騎 51 有一天我心血來潮騎着去趕集 52 我手里拿着小皮鞭 53 我心里很得意 54 不知怎么嘩啦啦啦啦 55 摔了一身泥 56 我有一只小毛驢 我從來也不騎 57 有一天我心血來潮 騎着去趕集 58 我手里拿着小皮鞭 我心里很得意 59 不知怎么嘩啦啦啦 摔了一身泥 60 我有一只小毛驢 我從來也不騎 61 有一天我心血來潮 騎着去趕集 62 我手里拿着小皮鞭 我心里很得意 63 不知怎么嘩啦啦啦 摔了一身泥 64 我手里拿着小皮鞭 我心里很得意 65 不知怎么嘩啦啦啦 摔了一身泥
二.文件的寫入姿勢
姿勢1:打開一個文件,如果沒有就創建,如果有這個文件就清空文件內容(相當於python中的"w")
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "os" 12 "log" 13 ) 14 15 16 17 func main() { 18 f,err := os.Create("a.txt") //姿勢一:打開一個文件,如果沒有就創建,如果有這個文件就清空文件內容,需要用兩個變量接受相應的參數 19 if err != nil { 20 log.Fatal(err) 21 } 22 f.WriteString("yinzhengjie\n") //往文件寫入相應的字符串。 23 f.Close() 24 }
姿勢2:以追加的方式打開一個文件(相當於python中的"a")
OpenFile 函數有三個參數:文件名、一個或多個標志(使用邏輯運算符“|”連接),使用的文件權限。我們通常會用到以下標志:
1>.os.O_RDONLY :只讀
2>.os.WRONLY :只寫
3>.os.O_CREATE :創建:如果指定文件不存在,就創建該文件。
4>.os.O_TRUNC :截斷:如果指定文件已存在,就將該文件的長度截為0。
在讀文件的時候,文件的權限是被忽略的,所以在使用 OpenFile 時傳入的第三個參數可以用0。
1 /*
2 #!/usr/bin/env gorun
3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
5 EMAIL:y1053419035@qq.com 6 */
7
8 package main 9
10 import ( 11 "os"
12 "log"
13 ) 14
15
16 func main() { 17 f,err := os.OpenFile("a.txt",os.O_APPEND|os.O_CREATE|os.O_RDWR,0644) //表示最佳的方式打開文件,如果不存在就創建,打開的模式是可讀可寫,權限是644 18 if err != nil { 19 log.Fatal(err) 20 } 21 f.WriteString("yinzhengjie\n") 22 f.Close() 23 }
姿勢3:修改文件內容-隨機寫入(自定義插入的位置,相當python重的seek方法)
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "os" 12 "log" 13 ) 14 15 16 func main() { 17 f,err := os.OpenFile("a.txt",os.O_CREATE|os.O_RDWR,0644) 18 if err != nil { 19 log.Fatal(err) 20 } 21 f.WriteString("yinzhengjie\n") 22 f.Seek(1,os.SEEK_SET) //表示文件的其實位置,從第二個字符往后寫入。 23 f.WriteString("$$$") 24 f.Close() 25 }
姿勢4.ioutil方法創建文件
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "fmt" 12 "io/ioutil" 13 "os" 14 ) 15 16 var ( 17 FileName = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.txt" 18 OutputFile = "E:\\Code\\Golang\\Golang_Program\\文件處理\\復制的小毛驢.txt" 19 ) 20 21 func main() { 22 buf, err := ioutil.ReadFile(FileName) //將整個文件的內容讀到一個切片中。 23 if err != nil { 24 fmt.Fprintf(os.Stderr, "File Error: %s\n", err) 25 // panic(err.Error()) 26 } 27 //fmt.Printf("%s\n", string(buf)) 28 err = ioutil.WriteFile(OutputFile, buf, 0x644) //我們將讀取到的內容又重新寫入到另外一個OutputFile文件中去。 29 if err != nil { 30 panic(err. Error()) 31 } 32 33 /*注意,在執行該代碼之后,就會生成一個OutputFile文件,其內容和FileName的內容是一致的喲!*/ 34 }
三.文件的刪除操作
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import "os" 11 12 var ( 13 FileName = "E:\\Code\\Golang\\Golang_Program\\文件處理\\復制的小毛驢.txt" 14 ) 15 16 func main() { 17 os.Remove(FileName) //刪除文件比較方便,直接用OS包就搞定啦的Remove方法就搞定案啦! 18 }
四.目錄的操作姿勢
1.目錄的創建操作
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "os" 12 ) 13 14 var ( 15 OneLevelDirectory = "yinzhengjie" 16 MultilevelDirectory = "yinzhengjie/golang/code" 17 ) 18 func main() { 19 os.Mkdir(OneLevelDirectory, 0777) //創建名稱為OneLevelDirectory的目錄,設置權限為0777。相當於Linux系統中的“mkdir yinzhengjie” 20 os.MkdirAll(MultilevelDirectory, 0777) //創建MultilevelDirectory多級子目錄,設置權限為0777。相當於Linux中的 “mkdir -p yinzhengjie/golang/code” 21 }
2.目錄的刪除操作
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "fmt" 12 "os" 13 ) 14 15 var ( 16 OneLevelDirectory = "yinzhengjie" 17 MultilevelDirectory = "yinzhengjie/golang/code" 18 ) 19 20 func main() { 21 err := os.Remove(MultilevelDirectory) //刪除名稱為OneLevelDirectory的目錄,當目錄下有文件或者其他目錄是會出錯。 22 if err != nil { 23 fmt.Println(err) 24 } 25 os.RemoveAll(OneLevelDirectory) //根據path刪除多級子目錄,如果 path是單個名稱,那么該目錄不刪除。 26 }
五.文件處理進階知識
1.讀取壓縮文件
compress 包提供了讀取壓縮文件的功能,支持的壓縮文件格式為:bzip2、flate、gzip、lzw 和 zlib。下面的程序展示了如何讀取一個 gzip 文件。
1 [root@yinzhengjie code]# ll 2 總用量 16 3 -rw-r--r--+ 1 root root 891 11月 8 13:55 littleDonkey 4 -rw-r--r--+ 1 root root 734 11月 8 13:57 readFile.go 5 [root@yinzhengjie code]# more littleDonkey 6 歌曲:我有一只小毛驢 7 歌手:碧瑤 8 專輯:《瑤謠搖》 9 發行時間:2014-03-18 10 詞:付林 11 曲:付林 12 歌詞: 13 我有一只小毛驢 14 我從來也不騎 15 有一天我心血來潮騎着去趕集 16 我手里拿着小皮鞭 17 我心里很得意 18 不知怎么嘩啦啦啦啦 19 摔了一身泥 20 我有一只小毛驢 21 我從來也不騎 22 有一天我心血來潮騎着去趕集 23 我手里拿着小皮鞭 24 我心里很得意 25 不知怎么嘩啦啦啦啦 26 摔了一身泥 27 我有一只小毛驢 我從來也不騎 28 有一天我心血來潮 騎着去趕集 29 我手里拿着小皮鞭 我心里很得意 30 不知怎么嘩啦啦啦 摔了一身泥 31 我有一只小毛驢 我從來也不騎 32 有一天我心血來潮 騎着去趕集 33 我手里拿着小皮鞭 我心里很得意 34 不知怎么嘩啦啦啦 摔了一身泥 35 我手里拿着小皮鞭 我心里很得意 36 不知怎么嘩啦啦啦 摔了一身泥 37 [root@yinzhengjie code]# tar zcf littleDonkey.tar.gz littleDonkey #創建壓縮文件 38 [root@yinzhengjie code]# go run readFile.go littleDonkey.tar.gz 39 littleDonkey0000644000000000000000000000157313200516146012152 0ustar rootroot歌曲:我有一只小毛驢 40 歌手:碧瑤 41 專輯:《瑤謠搖》 42 發行時間:2014-03-18 43 詞:付林 44 曲:付林 45 歌詞: 46 我有一只小毛驢 47 我從來也不騎 48 有一天我心血來潮騎着去趕集 49 我手里拿着小皮鞭 50 我心里很得意 51 不知怎么嘩啦啦啦啦 52 摔了一身泥 53 我有一只小毛驢 54 我從來也不騎 55 有一天我心血來潮騎着去趕集 56 我手里拿着小皮鞭 57 我心里很得意 58 不知怎么嘩啦啦啦啦 59 摔了一身泥 60 我有一只小毛驢 我從來也不騎 61 有一天我心血來潮 騎着去趕集 62 我手里拿着小皮鞭 我心里很得意 63 不知怎么嘩啦啦啦 摔了一身泥 64 我有一只小毛驢 我從來也不騎 65 有一天我心血來潮 騎着去趕集 66 我手里拿着小皮鞭 我心里很得意 67 不知怎么嘩啦啦啦 摔了一身泥 68 我手里拿着小皮鞭 我心里很得意 69 不知怎么嘩啦啦啦 摔了一身泥 70 Done reading file 71 [root@yinzhengjie code]# 72 [root@yinzhengjie code]# pwd 73 /yinzhengjie/golang/code 74 [root@yinzhengjie code]# ll 75 總用量 24 76 -rw-r--r--+ 1 root root 891 11月 8 13:55 littleDonkey 77 -rw-r--r--+ 1 root root 385 11月 8 13:58 littleDonkey.tar.gz 78 -rw-r--r--+ 1 root root 734 11月 8 13:57 readFile.go 79 [root@yinzhengjie code]#
2.文件拷貝
我們在上面用ioutil方法來拷貝一個文件,但是拷貝文件的話,還有一個更高效率的文件,就是io模塊的copy方法。具體代碼如下:
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "fmt" 12 "io" 13 "os" 14 ) 15 16 var ( 17 SourceFile string //源數據的文件 18 DestinationFile string //拷貝的文件 19 ) 20 21 func CopyFile(dstName, srcName string) (written int64, err error) { 22 src, err := os.Open(srcName) 23 if err != nil { 24 return 25 } 26 defer src.Close() 27 dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644) 28 if err != nil { 29 return 30 } 31 defer dst.Close() 32 return io.Copy(dst, src) 33 } 34 35 func main() { 36 SourceFile = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.txt" 37 DestinationFile = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.bak" 38 CopyFile(DestinationFile, SourceFile) 39 fmt.Println("Copy done!") 40 } 41 42 43 44 #以上代碼執行結果如下: 45 Copy done!
3.將文件的歌曲信息重定向到一個新文件
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "bufio" 12 "fmt" 13 "os" 14 "io" 15 ) 16 17 var ( 18 OldFile = "E:\\Code\\Golang\\Golang_Program\\文件處理\\我有一只小毛驢.txt" 19 NewFile = "E:\\Code\\Golang\\Golang_Program\\文件處理\\歌曲信息.txt" 20 Counts int //用於統計當前的行數。 21 ) 22 23 func main() { 24 inputFile, _ := os.Open(OldFile) 25 outputFile, _ := os.OpenFile(NewFile, os.O_WRONLY|os.O_CREATE, 0666) 26 defer inputFile.Close() 27 defer outputFile.Close() 28 inputReader := bufio.NewReader(inputFile) 29 for { 30 Counts ++ 31 inputString, _, readerError := inputReader.ReadLine() 32 if readerError == io.EOF { 33 break 34 } 35 outputString := string([]byte(inputString))+ "\n" 36 if Counts < 7 { 37 outputFile.WriteString(outputString) 38 } 39 } 40 fmt.Println("文件加載完畢!") 41 } 42 43 44 45 #以上代碼執行結果如下: 46 文件加載完畢!
4.使用接口的實際例子:fmt.Fprintf
1 /* 2 #!/usr/bin/env gorun 3 @author :yinzhengjie 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 5 EMAIL:y1053419035@qq.com 6 */ 7 8 package main 9 10 import ( 11 "fmt" 12 "os" 13 "bufio" 14 ) 15 16 func main() { 17 fmt.Fprintf(os.Stdout, "[%s]\n", "Yinzhengjie") //fmt.Fprintf方法要求第一個參數必須有可寫的方法,第二個參數用於定義格式化輸出,第三個參數是具體的字符串。 18 buf := bufio.NewWriter(os.Stdout) //我們創建一個寫入器名字叫做buf,注意,bufio.NewWriter方法需要傳入的對象必須有一個可寫的方法。 19 fmt.Fprintf(buf, "【%s】\n", "Golang") 20 buf.Flush() //在緩沖寫入的最后千萬不要忘了使用 Flush() ,否則最后的輸出不會被寫入。 21 } 22 23 24 25 #以上代碼執行結果如下: 26 [Yinzhengjie] 27 【Golang】