「Go/ファイル入出力」の版間の差分

< Go
削除された内容 追加された内容
Go 版176949から分割
(相違点なし)

2021年4月14日 (水) 09:46時点における版

実行しているプログラムファイル以外の外部ファイルを読み込んだり、外部ファイルを作成したり、外部ファイルに書き込んだりすることを「ファイル入出力」と言います。

Go言語では "os" パッケージをインポートしないと、ファイル入出力できないです。

osパッケージの組み込み関数である os.Create 関数で、外部ファイルを作成できます。

os.Create 関数を使用する際、この関数は戻り値を2つ使用します。むりやりに戻り値を1つだけでコードを書いてもエラーになります。


os.Create 関数の第1引数は、正常動作時の戻り値、第2引数はエラー時に書き込まれる戻り値であると、Go言語の仕様が決まっています。


下記コードでは、わかりやすさを重視するため、ファイルのオープンのエラー時の処理を省略しています。

「nil」とは、よその言語でいう「ヌル」みたいなもので、データの空いている状態をあらわすモノです。

下記コードではエラーが起きた場合、変数 kensa はos.Createによって書き込まれるので、もはや空白ではなくなるので、

if kensa != nil {

となっているのです。関係演算子の「 != 」とは「でなければ」という意味です。


コード例
package main

import (
	//"fmt"
	"os"
)

func main() {
	namae := "ftes.txt"
	
	var nanka *os.File
	var kensa error
	
	nanka, kensa = os.Create(namae)
	
	if kensa != nil {
	    // ひとまずダミー
	}
	
	mojiretu := []byte("書き込みテストhj4")
	nanka.Write(mojiretu)
	 
}


実行の結果
「ftes.txt」という名前のファイルが作成されているハズ。
そもファイル「ftes.txt」を開いて閲覧すると、「サンプル」と書かれている。


*os.File

のosの前についている記号はアスタリスクです。


text1 := []byte("書き込みテスト4")

[]byteは、そういう予約語みたいなものです(スライス関連)。慣用句として、そのまま覚えたほうが早いです。


上記コードでは、予約語以外の部分を「namae」(名前)とか「nanka」(何か)とか「kensa」(検査)とかにしましたが、

実際のコードでは慣用的に英語で機能に近い意味の名称が使われます。

コード例
package main

import (
	//"fmt"
	"os"
)

func main() {
	fname := "ftes.txt"
	
	var file *os.File
	var err error
	
	file, err = os.Create(fname)
	
	if err != nil {
	    // ひとまずダミー
	}
	
	txt := []byte("書き込みテスト3")
	file.Write(txt)
    
    file.Close()
}


os.Create() 関数や os.Open() 関数によって開かれたファイルは、 Close() によって閉じることができます。閉じられたファイルは、再度 開くまでは、読み書きができない状態になっています。

間違えてデータを壊すことを防ぐ安全のため、なるべくファイルは使い終わったら、すぐに閉じるのが無難です。


Go言語の関数は、2個以上の値を返却できる。こういう風に、1つの関数が複数の値を返却できる仕組みを多値返却という。

ほかのプログラム言語でも、PerlPythonの関数も、あまり話題にならないが、実はそれらの言語の関数は多値返却も出来る。


余談

2019年、エラー処理について、文法の改訂案が出された。

その提案は、エラー時のif文を毎回書くのは非効率なので、C++でいう try catch 構文のようなエラー処理のための例外処理の文法を搭載しようという案である。

だが、2019年、一度、この案は棄却された。Go1.14では採用がいったんは棄却されたが、引き続き、なんらかの改善は必要性があるとして、今後のバージョンでは注目が必要である。

なお、2020年現在、まだGoの最新版のバージョン番号は Go1.14 台である。