ファイルの読み書き操作#
1 行ファイルの読み取り#
package main
import (
"fmt"
"os"
)
func main() {
// os.Open関数を呼び出してファイルを開く
file, err := os.Open("ファイルの読み書き/a.txt")
if err != nil {
fmt.Println("ファイルを開くのに失敗しました")
return
}
// リソースを閉じる(この行は最後に実行されます)
defer file.Close()
// スライスcontentを作成します。make([]byte, 100, 100)はmake([]byte, 100)と簡略化できます
content := make([]byte, 100)
// Read関数を呼び出してファイルを読み取り、ファイルが占めるバイト数を返します
n, err := file.Read(content)
if err != nil {
fmt.Println("ファイルの読み取りに失敗しました")
return
}
// 最初のnバイトを出力し、文字列に強制変換します
fmt.Println(string(content[0:n]))
}
複数行ファイルの読み取り#
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
open, err := os.Open("ファイルの読み書き/c.txt")
if err != nil {
fmt.Println("ファイルの読み取りに失敗しました")
return
}
defer open.Close()
// バッファリーダーを作成します
reader := bufio.NewReader(open)
for {
// 改行文字で区切って1行ずつ読み取り、最後の行までforループで処理します
readString, err := reader.ReadString('\n')
if err != nil {
// エラーが発生し、io.EOFは最後の行まで読み取ったことを示します
if err == io.EOF {
// 最後の行の内容を出力し、ループを終了します
fmt.Print(readString)
break
} else {
fmt.Println("エラーが発生しました:", err)
return
}
} else {
// 最後の行以外の各行の内容を順番に出力します
fmt.Print(readString)
}
}
}
ファイルへの書き込み#
package main
import (
"fmt"
"os"
)
func main() {
// os.Create関数を呼び出してファイルを作成します
file, err := os.Create("ファイルの読み書き/c.txt")
if err != nil {
fmt.Println("ファイルの作成に失敗しました")
return
}
defer file.Close()
content := "こんにちは、美女!"
// Write関数を呼び出してファイルに書き込み、ファイルが占めるバイト数を返します
n, err := file.Write([]byte(content))
if err != nil {
fmt.Println("ファイルの書き込みに失敗しました")
return
} else {
fmt.Printf("%dバイト書き込みました", n)
}
}
JSON シリアライズ#
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string
Sex string
Age int
}
type Class struct {
Id string
Students []Student
}
func main() {
s := Student{"山田太郎", "男性", 18}
c := Class{"3年2組", []Student{s, s, s}}
// Marshal関数を呼び出してシリアライズします
m, err := json.Marshal(c)
if err != nil {
fmt.Println("JSONシリアライズに失敗しました", err)
return
}
fmt.Println(string(m))
println("_______________________________________________")
// Marshal関数を呼び出してデシリアライズします
var x Class
err = json.Unmarshal(m, &x)
if err != nil {
fmt.Println("JSONデシリアライズに失敗しました", err)
return
}
fmt.Println(x)
}
サードパーティライブラリを使用して最適化する:
パッケージをインポートするため、ターミナルに以下のコマンドを入力してください:go get github.com/bytedance/sonic
package main
import (
"fmt"
"github.com/bytedance/sonic"
)
type Student struct {
Name string
Sex string
Age int
}
type Class struct {
Id string
Students []Student
}
func main() {
s := Student{"山田太郎", "男性", 18}
c := Class{"3年2組", []Student{s, s, s}}
// jsonの代わりにsonicを使用し、Marshal関数を呼び出してシリアライズします
m, err := sonic.Marshal(c)
if err != nil {
fmt.Println("JSONシリアライズに失敗しました", err)
return
}
fmt.Println(string(m))
println("_______________________________________________")
// jsonの代わりにsonicを使用し、Marshal関数を呼び出してデシリアライズします
var x Class
err = sonic.Unmarshal(m, &x)
if err != nil {
fmt.Println("JSONデシリアライズに失敗しました", err)
return
}
fmt.Println(x)
}