You are a helpful assistant.
system
Bằng cách sử dụng GoLang, viết một ứng dụng máy chủ lắng nghe trên một cổng được chỉ định và phản hồi theo thời gian hiện tại bất cứ khi nào nó nhận được yêu cầu GET, đồng thời tích hợp cơ chế xử lý lỗi, ghi log, và đảm bảo định dạng phản hồi bao gồm các tiêu đề thích hợp, cho phép xử lý nhiều yêu cầu đồng thời.
user
Để viết một ứng dụng máy chủ bằng GoLang lắng nghe trên một cổng được chỉ định và phản hồi theo thời gian hiện tại khi nhận được yêu cầu GET, bạn có thể làm theo các bước sau. Ứng dụng này sẽ bao gồm xử lý lỗi, ghi log, và đảm bảo định dạng phản hồi với các tiêu đề thích hợp, đồng thời hỗ trợ xử lý nhiều yêu cầu đồng thời.

```go
package main

import (
	"fmt"
	"log"
	"net/http"
	"time"
)

// handler function để xử lý yêu cầu GET
func timeHandler(w http.ResponseWriter, r *http.Request) {
	// Kiểm tra phương thức yêu cầu
	if r.Method != http.MethodGet {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	// Lấy thời gian hiện tại
	currentTime := time.Now().Format(time.RFC1123)

	// Ghi log thông tin yêu cầu
	log.Printf("Received request from %s", r.RemoteAddr)

	// Thiết lập tiêu đề phản hồi
	w.Header().Set("Content-Type", "text/plain; charset=utf-8")

	// Gửi phản hồi với thời gian hiện tại
	fmt.Fprintf(w, "Current time: %s\n", currentTime)
}

func main() {
	// Đặt địa chỉ và cổng cho máy chủ
	addr := ":8080"

	// Đăng ký handler cho đường dẫn "/time"
	http.HandleFunc("/time", timeHandler)

	// Ghi log thông tin máy chủ bắt đầu lắng nghe
	log.Printf("Starting server on %s", addr)

	// Bắt đầu máy chủ và xử lý lỗi nếu có
	if err := http.ListenAndServe(addr, nil); err != nil {
		log.Fatalf("Could not start server: %s\n", err)
	}
}
```

### Giải thích:

1. **Gói `net/http`:** Sử dụng gói này để tạo máy chủ HTTP và xử lý các yêu cầu.

2. **Handler Function:** `timeHandler` là hàm xử lý cho các yêu cầu đến đường dẫn `/time`. Nó kiểm tra phương thức yêu cầu, ghi log thông tin, thiết lập tiêu đề phản hồi, và gửi thời gian hiện tại về cho client.

3. **Ghi Log:** Sử dụng `log.Printf` để ghi log thông tin về các yêu cầu và trạng thái máy chủ.

4. **Đồng thời:** `http.ListenAndServe` tự động xử lý các yêu cầu đồng thời bằng cách tạo một goroutine mới cho mỗi yêu cầu.

5. **Xử lý lỗi:** Sử dụng `http.Error` để gửi mã lỗi HTTP nếu phương thức không phải là GET. Sử dụng `log.Fatalf` để ghi log và thoát chương trình nếu máy chủ không thể khởi động.

6. **Tiêu đề phản hồi:** Đặt tiêu đề `Content-Type` để đảm bảo phản hồi được định dạng đúng cách.

Bạn có thể chạy ứng dụng này và truy cập `http://localhost:8080/time` để xem thời gian hiện tại được trả về.
assistant