The PathError
type found in Golang's os
library:
type PathError struct {
Op string
Path string
Err error
}
func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
nearly fulfills Go's error
interface:
type error interface {
Error() string
}
However, when trying to pass it as an error, you get the following compile time error:
cannot use (type os.PathError) as type error in argument...
os.PathError does not implement error (Error method has pointer receiver)
Why would os.PathError
use a pointer receiver for the Error method, and just avoid meeting the requirements of the error interface?
Full example:
package main
import (
"fmt"
"os"
)
func main() {
e := os.PathError{Path: "/"}
printError(e)
}
func printError(e error) {
fmt.Println(e)
}
Read about method sets here: https://golang.org/ref/spec#Method_sets
The method set of any other type T consists of all methods declared with receiver type T. The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T)
You are trying to call a function taking the error
interface using type os.PathError
. According to the above, it does not implement Error() string
, because that method is defined on type *os.PathError
.
Having os.PathError
you can get *os.PathError
using the &
operator:
printError(&os.PathError{...})