[pkg] ioutil
ioutil @ golang
寫檔 write file
// []byte 指的是 byte slice
// perm 指的是 permission,也就是誰可以讀取或寫入檔案
func WriteFile(filename string, data []byte, perm os.FileMode) error
err := ioutil.WriteFile(filename, bs, 0666)
Example 將 string slice 轉字串後,再轉成 byte 進行存檔
string slice —> string —> byte
package main
import (
"io/ioutil"
"strings"
)
// STEP 1: 定義 fruits type
type fruits []string
func main() {
favoriteFruits := fruits{"Apple", "Banana", "Orange", "Guava"}
favoriteFruits.saveToFile("fruits")
}
// STEP 2: 將 type fruits 轉成字串的 toString 的方法
func (f fruits) toString() string {
return strings.Join(f, ",")
}
// STEP 3: 將 type fruits 轉成 byte slice 並存檔的方式
func (f fruits) saveToFile(filename string) error {
s := f.toString()
bs := []byte(s) // 型別轉換:將字串轉換成 byte slice
return ioutil.WriteFile(filename, bs, 0666) // 0666 任何人都可以讀寫此檔案
}
讀檔 Read File
// 回傳 byte slice 和 error
func ReadFile(filename string) ([]byte, error)
bs, err := ioutil.ReadFile(filename)
使用 os.IsNotExist(err)
來判斷錯誤是否是因為檔案不存在導致:
bs, err := ioutil.ReadFile(fname)
if err != nil {
if os.IsNotExist(err) {
fmt.Printf("%s: File not found. Creating new file.\n", fname)
} else {
log.Fatalln("Error reading file:", err)
}
}
Example 讀取檔案
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
type fruits []string
func main() {
favoriteFruits := newFruitsFromFile("fruits")
favoriteFruits.print()
}
func (f fruits) print() {
for _, fruit := range f {
fmt.Println(fruit)
}
}
// 讀取檔案並轉成 type fruits
func newFruitsFromFile(filename string) fruits {
bs, err := ioutil.ReadFile(filename)
// err 沒有錯誤的話會回傳 nil
if err != nil {
// 當有錯誤時顯示錯誤訊息並離開程式
fmt.Println("Error: ", err)
os.Exit(1)
}
s := string(bs) // 從 byte slice 轉成 string
ss := strings.Split(s, ",") // 從 string 轉成 string slice
return fruits(ss) // 從 string slice 轉成 fruits type 後回傳
}