You are a helpful assistant.
system
Triển khai chương trình Golang tính giai thừa của một số nguyên dương cho trước bằng cách sử dụng đệ quy, đồng thời đảm bảo rằng chương trình xử lý các trường hợp biên, thực hiện kiểm tra lỗi cho các đầu vào không hợp lệ, và tuân thủ các quy tắc lập trình chuẩn.
user
Dưới đây là một chương trình Golang tính giai thừa của một số nguyên dương cho trước bằng cách sử dụng đệ quy. Chương trình này cũng xử lý các trường hợp biên và kiểm tra lỗi cho các đầu vào không hợp lệ.

```go
package main

import (
	"errors"
	"fmt"
)

// Hàm tính giai thừa sử dụng đệ quy
func factorial(n int) (int, error) {
	if n < 0 {
		return -1, errors.New("số nhập vào phải là số nguyên dương")
	}
	if n == 0 || n == 1 {
		return 1, nil
	}
	result, err := factorial(n - 1)
	if err != nil {
		return -1, err
	}
	return n * result, nil
}

func main() {
	var n int
	fmt.Print("Nhập một số nguyên dương: ")
	_, err := fmt.Scan(&n)
	if err != nil {
		fmt.Println("Lỗi: Vui lòng nhập một số nguyên hợp lệ.")
		return
	}

	result, err := factorial(n)
	if err != nil {
		fmt.Println("Lỗi:", err)
		return
	}

	fmt.Printf("Giai thừa của %d là %d\n", n, result)
}
```

### Giải thích:

1. **Hàm `factorial`**: Đây là hàm đệ quy để tính giai thừa. Nó kiểm tra nếu `n` nhỏ hơn 0, trả về lỗi vì giai thừa chỉ được định nghĩa cho các số nguyên không âm. Nếu `n` là 0 hoặc 1, hàm trả về 1 (vì 0! = 1! = 1). Nếu không, hàm gọi chính nó với `n-1` và nhân kết quả với `n`.

2. **Hàm `main`**: Chương trình bắt đầu từ đây. Nó yêu cầu người dùng nhập một số nguyên dương. Nếu đầu vào không hợp lệ, chương trình sẽ thông báo lỗi. Sau đó, nó gọi hàm `factorial` và xử lý lỗi nếu có, cuối cùng in ra kết quả giai thừa.

Chương trình này đảm bảo rằng chỉ các số nguyên dương mới được chấp nhận và xử lý các lỗi đầu vào một cách hợp lý.
assistant