Menu
CoddyTech

Struct ẩn danh

Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 15 trên 107.

struct ẩn danh là một struct không có kiểu được đặt tên. Bạn xác định cấu trúc và tạo một instance trong một bước mà không dùng từ khóa type.

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

Cách này tạo trực tiếp một giá trị struct mà không cần khai báo kiểu có thể tái sử dụng. Struct ẩn danh rất hữu ích khi bạn cần một cấu trúc dữ liệu dùng một lần, nhanh chóng và không dùng ở nơi khác trong code.

Một trường hợp thường gặp là nhóm các dữ liệu liên quan cho một hàm (function) hoặc bài kiểm thử.

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

Struct ẩn danh cũng thường được dùng trong các bài kiểm thử theo bảng, nơi mỗi test case có các trường riêng.

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

Vì struct ẩn danh không có tên kiểu dữ liệu, bạn không thể định nghĩa phương thức cho chúng hoặc dùng lại kiểu dữ liệu đó ở nơi khác. Hãy dùng chúng để nhóm dữ liệu tạm thời trong phạm vi cục bộ. Với dữ liệu bạn sẽ tham chiếu nhiều lần, hãy định nghĩa một kiểu struct có tên.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống cấu hình đơn giản để minh họa khi nào struct ẩn danh phát huy tác dụng, khi cần nhóm dữ liệu chỉ dùng một lần và không cần kiểu dữ liệu có thể tái sử dụng.

Bạn sẽ tổ chức code trong hai tệp:

  • config.go: Tạo một hàm có tên GetServerConfig, nhận tên máy chủ (chuỗi), cổng (số nguyên) và chế độ gỡ lỗi (boolean) làm tham số. Hàm này sẽ trả về một struct ẩn danh chứa ba giá trị dưới dạng các trường: Name, Port và Debug. Vì cấu hình này chỉ được dùng ở một nơi nên bạn không cần định nghĩa kiểu có tên cho nó.
  • main.go: Đọc các giá trị cấu hình máy chủ từ đầu vào, gọi hàm GetServerConfig và hiển thị thông tin chi tiết về cấu hình.

Đầu vào sẽ gồm:

  • Dòng 1: Tên máy chủ
  • Dòng 2: Số cổng
  • Dòng 3: Chế độ gỡ lỗi (true hoặc false)

Định dạng đầu ra:

Server: [Name]
Port: [Port]
Debug: [Debug]

Ví dụ, với đầu vào là api-server, 8080 và true, đầu ra của bạn sẽ là:

Server: api-server
Port: 8080
Debug: true

Lưu ý cách struct ẩn danh giúp bạn trả về dữ liệu được nhóm lại mà không làm codebase thêm rườm rà với một kiểu chỉ được dùng một lần.

Tự làm thử

package main

import (
	"fmt"
)

func main() {
	// Đọc các giá trị đầu vào
	var name string
	var port int
	var debug bool

	fmt.Scanln(&name)
	fmt.Scanln(&port)
	fmt.Scanln(&debug)

	// TODO: Gọi GetServerConfig với các giá trị đầu vào
	// và lưu struct ẩn danh mà hàm trả về

	// TODO: In cấu hình theo đúng định dạng yêu cầu:
	// Server: [Name]
	// Port: [Port]
	// Debug: [Debug]
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Go online