Skip to content

Instantly share code, notes, and snippets.

@ksomemo
Last active August 29, 2015 14:04
Show Gist options
  • Save ksomemo/7e959941ef8cf69c260c to your computer and use it in GitHub Desktop.
Save ksomemo/7e959941ef8cf69c260c to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"math"
)
type ErrNegativeSqrt float64
/*
func (e ErrNegativeSqrt) String() string {
return fmt.Sprintf("%v by String()", float64(e))
}
*/
func (e ErrNegativeSqrt) Error() string {
_, ok := interface{}(e).(fmt.Stringer)
if ok {
return fmt.Sprintf("cannot Sqrt negative number: %v", e)
//return fmt.Sprintf("cannot Sqrt negative number: %v", e.String())
} else {
return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}
}
func Sqrt(f float64) (float64, error) {
if f < 0 {
return f, ErrNegativeSqrt(f)
}
return math.Sqrt(f), nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
fmt.Println(float64(ErrNegativeSqrt(-2)))
fmt.Println(error(ErrNegativeSqrt(-2)))
fmt.Println(ErrNegativeSqrt(-2))
}
1.4142135623730951 <nil>
-2 cannot Sqrt negative number: -2
-2
cannot Sqrt negative number: -2
cannot Sqrt negative number: -2

Program exited.
エラーは、エラー文字列としてエラーそのものを説明できるものです。
このしくみは、Goの組込みのインターフェース型 error に、文字列を返すひとつのメソッド Error をあらかじめ定義したことで実現されています
type error interface {
    Error() string
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment