スライスを読み込むには
【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト
◆スライスの読み込み
スライスは配列と似ていますが、最も特徴的な点は、Go の配列は宣言した時点で型とサイズが決められているのに対して、「スライスはサイズが決められていない」という点。
つまり、スライスは必要に応じてデータ領域を割り当て直すことで、動的な配列として振る舞います
・サンプルプログラム「wrpoints.go」
package main
import (
"fmt"
"log"
"os"
)
//Point 型の定義
//スライスの構造体
type Point struct{x,y int}
//定数
const fname = "points.data"
//Load 点の情報を読み込むメソッド
//スライスの情報 (内容、長さ、キャパシティ)
func Load() []Point {
var points = []Point{}
//ファイルを開く
file,err := os.OpenFile(fname,os.O_RDONLY,0666)
if err != nil {
log.Fatal(err)
}
//ファイルから読み込む
var x,y int
for{
n,err := fmt.Fscanf(file,"%d %d",&x,&y)
if n == 0 || err != nil {
break
} else {
points = append(points,Point{x,y})
}
}
//ファイルを閉じる
file.Close()
return points
}
//Save 点の情報を保存するメソッド
func Save(points []Point) int {
//ファイルを開く
file,err := os.OpenFile(fname,os.O_RDWR|os.O_CREATE,0666)
if err != nil {
log.Fatal(err)
}
//ファイルに書き込む
for _, p := range points {
fmt.Fprintf(file,"%d %d\n",p.x,p.y)
}
//ファイルを閉じる
file.Close()
return len(points) //書き込んだ点の数を返す
}
func main() {
var points = []Point{}
//5個のデータを作る
points = append(points, Point{5,5})
points = append(points, Point{7,8})
points = append(points, Point{4,3})
points = append(points, Point{7,4})
points = append(points, Point{9,5})
//データを表示
fmt.Println("書き込むデータ")
for i,p := range points{
fmt.Printf("point[%d] = (%d,%d)\n",i+1,p.x,p.y)
}
//データを保存する
Save(points)
//データを保存する
data := Load()
//読み込んだデータを表示する
fmt.Println("読み込んだデータ")
for i,p := range data {
fmt.Printf("point[%d] = (%d,%d)\n",i+1,p.x,p.y)
}
}
・実行
PS D:\GO言語\サンプルプログラム\Go-9> go run wrpoints.go
書き込むデータ
point[1] = (5,5)
point[2] = (7,8)
point[3] = (4,3)
point[4] = (7,4)
point[5] = (9,5)
読み込んだデータ
point[1] = (5,5)
point[2] = (7,8)
point[3] = (4,3)
point[4] = (7,4)
point[5] = (9,5)