0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(プログラミング)入門メモ⑥

Last updated at Posted at 2025-01-12

エラーハンドリングとは

プログラムにエラーが発生したときの処理をエラーハンドリングという。このときにエラーの内容を表示させて原因をわかりやすくさせるなど、エラーハンドリングは重要な意味を持つ。

エラーハンドリングの実施

エラーが発生したとき、どのように処理をするか。例えば、コードを書いたファイルをos.Openで読み込んだファイルの内容を変数file、エラーの内容をerrに入れる。エラーがある場合(変数errがnilではない場合)は、log.Fatallnで「Error!」と表示させる。
※nilとは?
他のプログラミング言語におけるnullやNoneと同じ概念。nilは値が存在しないことを示すために使用される。

func main() {
    file, err := os.Open("./lesson.go")  //ファイルを開く
    if err != nil{              //ファイルを開いたときのエラーハンドリング
        log.Fatallm("Error!") 
    }
    defer file.Close()       //エラーがなければファイルを最後に閉じる
}

os.Open関数は戻り値としてfileとerrの二つの戻り値を返す。

次にデータを書き込むためのbyte型スライスを作成し、変数dataに入れる。なお、byte型のスライスは、バイト配列と呼ばれることもよくある。

data := make([]byte,100) //バイト配列の作成

次にReadメソッドでファイルの内容を変数dataに読み込む。ここでも同様にエラーがnilでなければlog.Fatallnで「Error」を出力して処理を終了する。
Readメソッドの返り値として、読み込んだbyte数を変数countにエラーの内容を変数errに入れる。ここでサイドエラーハンドリングをする。

count, err := file.Read(data)
if err != nil {
    log.Fatalln("Error!")
}

最後に、変数countの値とstring型でcastした変数dataを表示する。実行すると100byte分読み込まれたコードが表示される。実行結果の最初の「100」は
100byte分が読み込まれたという意味。

import(
    "fmt"
    "os"
    "log"
)


func main() {
    file, err := os.Open("./lesson.go")  //ファイルを開く
    if err != nil{              //ファイルを開いたときのエラーハンドリング
        log.Fatalln("Error!") 
    }
    defer file.Close()  
    data := make([]byte,100)
    count, err := file.Read(data)
    if err != nil {
    log.Fatalln("Error!")
    }
    fmt.Println(count, string(data))
}

//以下のように出力される
100 package main    (byte数(100)が表示されたあと、ファイルの中身が表示される)
import(
    "fmt"
    "os"
    "log"
)

func main() {
    file, err := os.Open("./lesson.go")  //ファイルを開く
    if
    ↑ここまで出力範囲

※ほかのプログラミング言語では、エラーハンドリングをtry catchなどの方法で行うが、Go言語ではコードがエラーを返したとにエラーハンドリングを行う。そのため、エラーハンドリングのコードが複数になる。
また、エラーを返すパターンではどうなるかを確かめるために、ディレクトリを移動するos.Chdir関数の引数に存在しないディレクトリである「"test"」を指定する。この返り値を変数errに代入し、エラーがある場合はlog.Fatallnでコードを終了する

以下のコードをこれまで作成したものに追加する。

package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	file, err := os.Open("./lesson.go")
	if err != nil {
		log.Fatalln("Error!")
	}
	defer file.Close()
	data := make([]byte, 100)
	count, err := file.Read(data)
	if err != nil {
		log.Fatalln("Error")
	}
	fmt.Println(count, string(data))

    //追加した範囲
	err = os.Chdir("test")   
	if err != nil {
		log.Fatalln("Error")
	}
}

//実行結果はtestというディレクトリは存在しないため以下のようになる。
100 package main    
import(
    "fmt"
    "os"
    "log"
)

func main() {
    file, err := os.Open("./lesson.go")  
    if 
2025/01/12 18:11:02 Error!

学習に使用した教材

・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?