- Go không có try/catch/throw.
- Errors là values, check lỗi ngay sau khi gọi.
- Explicit > implicit.
go
// Hàm trả (result, error)
func readFile(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("readFile %s: %w", path, err)
}
return data, nil
}
// Xử lý lỗi tại nơi gọi
data, err := readFile("config.json")
if err != nil {
log.Fatal(err)
}
// Custom error
var ErrNotFound = errors.New("not found")
// Wrap và unwrap error
err := fmt.Errorf("service layer: %w", ErrNotFound)
errors.Is(err, ErrNotFound) // trueerrors.Is(), errors.As() để check error chain.
- Go has no try/catch/throw.
- Errors are values; check them immediately after the call.
- Explicit over implicit.
go
// Function returns (result, error)
func readFile(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("readFile %s: %w", path, err)
}
return data, nil
}
// Handle error at the call site
data, err := readFile("config.json")
if err != nil {
log.Fatal(err)
}
// Custom sentinel error
var ErrNotFound = errors.New("not found")
// Wrap and unwrap errors
err := fmt.Errorf("service layer: %w", ErrNotFound)
errors.Is(err, ErrNotFound) // trueUse errors.Is() and errors.As() to inspect the error chain.