LoginSignup
77
43

More than 5 years have passed since last update.

errors.New()とfmt.Errorf()って...

Last updated at Posted at 2014-09-11

何が違うんですか??

error型を返すところは同じです。

  • エラーメッセージを作る時に fmt.Sprintf() を使いたければ
    • errors.New()
  • そうでなければ
    • fmt.Errorf()

という風に使い分ければいいと思います。

error型を返すところは同じ

errors_example.go
package main

import (
    "errors"
    "fmt"
)

func errorByFmtErrorF() error {
    return fmt.Errorf("Error: %s", "dame-desu-yo")
}

func errorByErrorsNew() error {
    return errors.New(fmt.Sprintf("Error: %s", "aki-masen-yo"))
}

/*
func errorByFmtSprintF() error {
    return fmt.Sprintf("Error: %s", "ikema-sen-yo")
}
*/

func main() {
    fmt.Printf("fmt.Errorf: %#v\n", errorByFmtErrorF())
    fmt.Printf("errors.New: %#v\n", errorByErrorsNew())
    //fmt.Printf("fmt.Sprintf: %#v\n", errorByFmtSprintf())
}

実行結果

$ go run errors_example.go
fmt.Errorf: &errors.errorString{s:"Error: dame-desu-yo"}
errors.New: &errors.errorString{s:"Error: aki-masen-yo"}

同じですね。

ちなみに

上のコードのコメントをアンコメントアウトすると

$ go run errors_example.go 
# command-line-arguments
./errors_example.go:17: cannot use fmt.Sprintf("Error: %s", "ikema-sen-yo") (type string) as type error in return argument:
        string does not implement error (missing Error method)
./errors_example.go:23: undefined: errorByFmtSprintf

コンパイルが通りません。

errorByFmtSprintFerror型を返すfunctionなのに
string型を返してるからですね。

エラーメッセージをよく見てみると

string does not implement error (missing Error method)

Errorメソッドを持っていればerror型じゃなくても大丈夫っぽい??

ちゃんと調べて書く

errortypeじゃなくて、interfaceなの?

もしくは、
interface Error実装の一つがtype errorかな?

調べた

The Go Programming Language - Errors

interfaceでした!

77
43
0

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
77
43