跳至主要内容

[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 後回傳
}

參考