たった1日で基本が身に付く! Go言語 超入門@7日目
Metadata
Date: December 1st, 2020
Category: プログラミングを通して面白い課題を解決したい
途中、ざーっとやった所もあるけどやっと最終章にやってきました。
ここが一番やりたかったところなのでうれしい。
今日も頑張っていきます。
CHAPTER 8 Go言語の魅力を体験するプログラム
キーボードからの入力
package main
import "fmt"
func main() {
var input string
for {
fmt.Print("何か入力してください。'q'で終了: ")
fmt.Scanln(&input)
if input == "q" {
break
}
fmt.Println(input, "が入力されました")
}
fmt.Println("お疲れ様でした!")
}
キー入力の値を受け取るのは、fmtパッケージのScanlnという関数
「Scan」は、OSで定められた標準入力を受け取ることを示す名前
ほとんどのOSでは、標準入力はキー入力
「ln」は、改行キー(エンターキー)が押されるまで読み込むという意味
引数には&inputを指定して、同じ場所に保存する
ファイルからの入力
データ量が多くなれば、キー入力もファイル読み込みのほうが便利
ファイルの読み込みには、ioutilパッケージにあるReadFile関数を用いる
ioutilというパッケージはioパッケージの下部にあるのでio/ioutilと書く
import "io/ioutil"
content, err := ioutil.ReadFile("data.txt")
上記例では、このプログラムと同じフォルダ内にあるdata.txtの内容を読み込むように記述
package main
import (
"fmt"
"io/ioutil"
"strings"
"os"
)
func main() {
content, err := ioutil.ReadFile("data.txt")
if err != nil {
fmt.Println("ファイルの読み込みエラー", err)
os.Exit(1)
} else {
cstr := string(content)
lows := strings.Split(cstr, "\n")
for i, v := range lows {
if i > 0 && len(v) > 1 {
data := strings.Split(v, ",")
fmt.Printf("%sは%s円\n", data[0], data[1])
}
}
}
}
範囲節rangeによるfor
確か7章で出てきたけど、ちゃんと理解してなかったので。
for i, v := range lows { // iにはインデックス、vにはインデックスの位置の場所の要素が入る
if i > 0 && len(v) > 1 { // 二行目以降から処理をする
data := strings.Split(v, ",") // カンマで分割
fmt.Printf("%sは%s円\n", data[0], data[1]) // 1つ目の要素と2つ目の要素をそれぞれ表示
}
}
rangeはSliceやMapsを一つずつ反復処理するために使う
スライスをrangeで繰り返す場合は、反復ごとに2つの変数を返す
1つめの変数:インデックス(index)
2つめの変数:インデックスの場所の要素(value)
ファイルへの出力
ファイルへの書き込みにはioutil.WriteFile関数を用いる
err := ioutil.WriteFile("datafile.txt", wdata, 0777)
第1引数:書き込み先ファイル名
第2引数:書き込むデータ
第3引数:アクセス権
0644であれば読み取り専用
0777であれがすべて実行可能
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
var input string
var content string
for {
fmt.Print("何か入力してください。's'で保存:")
fmt.Scanln(&input) // キー入力したものを&inputに保存
if input == "s" { // sが入力されたら、処理を抜ける
break
}
content += input // sが入力されるまでは、contentに入力した文字を保存し続ける
}
wdata := []byte(content) // 文字をバイトに変換
err := ioutil.WriteFile("datafile.txt", wdata, 0777) // wdataの内容がdatafile.txtに反映されてファイルが作られる
if err != nil {
fmt.Println("書き込みエラーです", err)
os.Exit(1)
} else {
fmt.Println(content)
fmt.Println("以上、ファイルに保存しました")
}
}
今日の学び
キー入力やファイルの入力や出力をプログラムで扱えると一気に表現できることが増えた気がする
rangeを使ったfor文について復習できたので良かった