سلام وقت بخیر
من یه سوالی داشتم در رابطه با نحوه ی call شدن متد Error
این کد را در نظیر بگیرید
package main
import (
"errors"
"fmt"
"io"
"os"
)
type IOError struct {
FileName string
Message string
Err error
}
func (error *IOError) Unwrap() error {
return error.Err
}
func (error IOError) Error() string {
return fmt.Sprintf("IO error occurred: FileName: %s Message: %s Detail: %s", error.FileName, error.Message, error.Err.Error())
}
func CopyFile(srcName, dstName string) error {
src, err := os.Open(srcName)
if err != nil {
return &IOError{FileName: srcName, Message: "during copy file could not open source file", Err: err}
}
//defer src.Close()
dst, err := os.Create(dstName)
if err != nil {
return &IOError{FileName: srcName, Message: "during copy file could not create destination file", Err: err}
}
dst.Close()
_, err = io.Copy(dst, src)
fmt.Printf("**************%s***************\\n", err)
if err != nil {
return &IOError{FileName: srcName, Message: "during copy file could not copy", Err: err}
}
return nil
}
func main() {
err := CopyFile("src.txt", "dst.txt")
fmt.Printf("%s\\n", err)
fmt.Printf("Unwrap Error: %s", errors.Unwrap(err))
return
if err != nil {
fmt.Printf("Error: %s\\n", err)
}
}
وقتی خطای err را در main پرینت میکنیم میره متد Error را که خودمان rewrite کردیم call میکنه اما در فانکشن CopyFile وقتی مقدار err را printf میکنم سراغ متد Error نمیره
این قسمت برام مبهم هست اگر امکانش هست نحوه ی call شدن متد Error را trace کنید تا بیشتر متوجه بشیم ؟
//output
**************write dst.txt: file already closed***************
IO error occurred: FileName: src.txt Message: during copy file could not copy Detail: write dst.txt: file already closed
Unwrap Error: write dst.txt: file already closed