CVS 是以逗號,及換行\n分隔的資料格式,
從CSV的英文(Comma-Separated Values)中就能窺出一二。
用Excel開啟一個CSV檔案
(副檔名要為.csv  而非.xlsx。 xlsx是 Microsoft Office Excel 獨有的格式)

用記事本開啟一個CSV檔案
原來就長成這樣而已

(也有出現以空白字元 、\t 或其他字元來做分隔,只要解析時以該字元下去做區隔就行)
Golang讀檔案時會需要用到絕對路徑,
在這邊先取 pwd 當前路徑、再加上 fileName 檔案名稱。
var Pwd string
var FilePath string
var FileName = "test.csv"
func init() {
	Pwd, _ = os.Getwd()
	FilePath = filepath.Join(Pwd, FileName)
}
func Load() {
	file, err := os.OpenFile(FilePath, os.O_RDONLY, 0777) // os.O_RDONLY 表示只讀、0777 表示(owner/group/other)權限
	if err != nil {
		log.Fatalln("找不到CSV檔案路徑:", FilePath, err)
	}
	// read
	r := csv.NewReader(file)
	r.Comma = ','	// 以何種字元作分隔,預設為`,`。所以這裡可拿掉這行
	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatalln(err)
		}
		var a = record[0]
		var b = record[1]
		fmt.Println(a, b)
	}
}
讀取結果

os.O_RDONLY 唯讀
os.O_WRONLY 唯寫
os.O_RDWR   讀/寫
Write寫入單行
func Write() {
	file, err := os.OpenFile(FilePath, os.O_WRONLY, 0777)
	if err != nil {
		log.Fatalln("找不到CSV檔案路徑:", FilePath, err)
	}
	w := csv.NewWriter(file)
	x := []string{"999"}
	w.Write(x)
	w.Flush() // 把在buffer緩存中的所有資料輸出
}
WriteAll寫入多行
	w := csv.NewWriter(file)
	x := [][]string{{"999", "1"}, {"998", "997"}}
	w.WriteAll(x)
	w.Flush() // 把在buffer緩存中的所有資料輸出
若開啟一個空白檔案寫入,不會有任何問題。
但若開啟已經有資料的CSV,再寫入的話會發生炸裂
已有的原始資料

如果寫入以下一行資料
	w := csv.NewWriter(file)
	x := []string{"999"}
	w.Write(x)
	w.Flush() // 把在buffer緩存中的所有資料輸出
咦~~怎麼跟我預想的結果不太一樣?!
炸裂過後

怎麼多了一堆莫名其妙的空格?
用EXCEL開,會看不清發生了什麼事情,
但以記事本開啟的話:
資料從原本的狀態

變成這樣

也就是說,我輸入的單行的資料是'999'\n',把原始資料1,2,3,4'\n'給蓋過去
將最前面四個字元覆蓋掉了,就變成999'\n'3,4'\n' ...
所以用Excel打開才會被解析成上方那樣的炸裂圖。
打開檔案的時候以 O_APPEND 模式開啟,
就能不影響舊資料,將欲寫入的資料Append在最後了。
	file, err := os.OpenFile(FilePath, os.O_APPEND, 0777)