何が違うんですか??
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
コンパイルが通りません。
errorByFmtSprintF
はerror
型を返すfunctionなのに
string
型を返してるからですね。
エラーメッセージをよく見てみると
string does not implement error (missing Error method)
Errorメソッドを持っていればerror
型じゃなくても大丈夫っぽい??
ちゃんと調べて書く
error
はtype
じゃなくて、interface
なの?
もしくは、
interface Error
実装の一つがtype error
かな?
調べた
The Go Programming Language - Errors
interface
でした!